我有两个数据框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
第二个DataFrame:
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具有更多列,但是我只想更新一列(例如,“价格”)。
答案 0 :(得分:2)
首先,您可以合并:
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
答案 1 :(得分:2)
使用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
答案 2 :(得分:1)
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