我有两个数据帧df和df1。
主数据帧如下:
DF:
start end price
0 A Z 1
1 B Y 2
2 C X 3
3 A Z 4
4 D W 5
第二个数据帧:DF1:
start end price
0 A Z 100
1 B Y 200
我希望主数据帧 df 根据 df1 中的开始和结束更新"价格"列中的值。 它应该更新与 DF1 中具有相同开始和结束的所有行的列值。 DF:
start end price
0 A Z 100
1 B Y 200
2 C X 3
3 A Z 100
4 D W 5
(df 中的所有 A-Z 和 B-Y 都应该更新(。无论如何我可以得到这个输出吗?实际上,datframe有更多的列,但我只想更新一列(例如"价格"(。
首先,您可以合并:
s = df1.merge(df2, left_on=['start', 'end'], right_on=['start', 'end'], how='left')
然后,您可以fillna
所需的列并为其编制索引:
s.assign(price=s.price_y.fillna(s.price_x))[['start', 'end', 'price']]
start end price
0 A Z 100.0
1 B Y 200.0
2 C X 3.0
3 A Z 100.0
4 D W 5.0
使用update
df=df.set_index(['start','end'])
df.update(df1.set_index(['start','end']))
df.reset_index()
Out[99]:
start end price
0 A Z 100.0
1 B Y 200.0
2 C X 3.0
3 A Z 100.0
4 D W 5.0
merge
df.drop('price', 1).merge(df1, 'left').fillna(df)
start end price
0 A Z 100.0
1 B Y 200.0
2 C X 3.0
3 A Z 100.0
4 D W 5.0
- 我要合并
['start', 'end']
,那个讨厌的price
会妨碍我。 所以,我放弃了它。 - 我需要保留
df
索引,因为我有重复的'A'
和'Z'
. 所以,我使用'left'
merge
- 现在我缺少的元素可以用
df
填充