根据另一个数据帧中的值从数据帧中选择行,并根据第二个数据帧使用值更新其中一列



我有两个数据帧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

  1. 我要合并['start', 'end'],那个讨厌的price会妨碍我。 所以,我放弃了它。
  2. 我需要保留df索引,因为我有重复的'A''Z'. 所以,我使用'left'merge
  3. 现在我缺少的元素可以用df
  4. 填充

最新更新