虽然这似乎是以前问过的问题,但我还没有找到关于如何执行此功能的最佳实践的任何信息。
概述:我有两个数据框架;第一种是我所说的完整数据帧。可以说,它是原始的来源。然后我有一个数据框架,其中包括原始数据集的一部分,但有一些新的或更新的信息。
目标:我希望能够获取新的数据集并将其结果应用于原始数据框;将其值覆盖在原始数据集的行/列上。
问题:目前我的问题是我还没有发现使用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