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

时间:2018-09-21 01:51:38

标签: python pandas dataframe rows updating

我有两个数据框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具有更多列,但是我只想更新一列(例如,“价格”)。

3 个答案:

答案 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

  1. 我将在['start', 'end']上进行合并,而讨厌的price将会妨碍我。所以,我放下它。
  2. 我需要保留df索引,因为我重复了'A''Z'。因此,我使用'left' merge
  3. 现在可以使用df
  4. 来填写我缺少的元素