如何合并两个熊猫数据框架的匹配索引



虽然这似乎是以前问过的问题,但我还没有找到关于如何执行此功能的最佳实践的任何信息。

概述:我有两个数据框架;第一种是我所说的完整数据帧。可以说,它是原始的来源。然后我有一个数据框架,其中包括原始数据集的一部分,但有一些新的或更新的信息。

目标:我希望能够获取新的数据集并将其结果应用于原始数据框;将其值覆盖在原始数据集的行/列上。

问题:目前我的问题是我还没有发现使用merge的正确格式来获得我正在寻找的结果。我要么只得到与两个数据框相同的行,要么只得到原始集合,不添加新信息。

geoid = pandas.DataFrame({'Address': ['4050 Blake Ct', '1234 w east st'], 
'ID': ['789456', '654321'], 
'State': ['NV', 'NV'], 
'Zip': ['88991', '88991'], 
'Ph': ['789456', '456132']})
print(geoid)
Address      ID State    Zip      Ph
0   4050 Blake Ct  789456    NV  88991  789456
1  1234 w east st  654321    NV  88991  456132

original = pandas.DataFrame({'Address': ['', '1234 w east st', 'PO box 789'], 
'ID': ['789456', '654321', '654789'], 
'State': ['NV', 'CA', 'CA'], 
'Zip': ['88991', '88991', '99663'], 
'Ph': ['789456', '456132', '741852']})
print(original)
Address      ID State    Zip      Ph
0                  789456    NV  88991  789456
1  1234 w east st  654321    NV  88991  456132
2      PO box 789  654789    CA  99663  741852

# This produces the same as the original dataframe, with no changes
df = original.merge(geoid, how='left', on=list(original.columns))
# This keeps only the rows from the geoid dataframe
df = original.merge(geoid, how='right', on=list(original.columns))
# This duplicates the data so that it includes data from both dataframes
df = original.merge(geoid, how='outer', on=list(original.columns))
# This produces an empty dataframe
df = original.merge(geoid, how='inner', on=list(original.columns))

这是我正在寻找的结果:在大地水准面数据框的索引值为0时,存在4050 Blake Ct值,而在原始数据框中则为空白。我希望这个值复制到原始数据帧,覆盖原来的值。**注意:原始数据框中的空白单元格是可能存在的示例,但不限于空白单元格。理想情况下,我希望能够"覆盖"。我的大地水准面数据框,覆盖原始数据框。每个数据框的索引将始终与条目一致。将大地水准面数据帧看作是原始数据帧的排序或修剪版本。

Address      ID State    Zip      Ph
0  4050 Blake Ct   789456    NV  88991  789456
1  1234 w east st  654321    NV  88991  456132
2      PO box 789  654789    CA  99663  741852

在pandas函数之外有很多方法可以做到这一点,但我觉得一定有一种方法可以做到这一点,这是内置在pandas中的,但也许我错了。

您可以使用pandas.DataFrame.update方法。

geoid = geoid.set_index('ID')
original = original.set_index('ID')
original.update(geoid)

可以使用Dataframe.update()

original.update(geoid,join='left')

输出:

Address      ID State    Zip      Ph
0   4050 Blake Ct  789456    NV  88991  789456
1  1234 w east st  654321    NV  88991  456132
2      PO box 789  654789    CA  99663  741852

最新更新