如何将较大 pandas 数据帧中的单元格替换为较小数据帧中的单元格

2022-02-24 00:00:00 pandas find replace conditional

问题描述

我有两个 pandas 数据帧:

较小:

较大:

我希望匹配Ticker和Year,然后用较小的数据帧中的数字替换第一列和最后一列中的数字。

我尝试过使用pd.merge,但我只成功地添加了行或列,而没有替换特定的单元格。有人能发布一些代码来实现这一点吗?


解决方案

可以使用mergeWITH LEFT JOIN和suffixes,然后使用combine_firstWITH RENAME FOR REMOVE_

df1 = pd.DataFrame({'Ticker':list('abcdef'),
                   'Year':[2013,2014,2013,2014,2013,2014],
                   'C':[7,8,9,4,2,3],
                   'Last':[1,3,5,7,1,0],
                   'First':[5,3,6,9,2,4],
                   'F':list('aaabbb')})

print (df1)
   C  F  First  Last Ticker  Year
0  7  a      5     1      a  2013
1  8  a      3     3      b  2014
2  9  a      6     5      c  2013
3  4  b      9     7      d  2014
4  2  b      2     1      e  2013
5  3  b      4     0      f  2014

df2 = pd.DataFrame({'First':[4,5,4,5],
                   'Last':[7,8,9,4],
                   'Year':[2013,2014,2014,2015],
                   'Ticker':list('aabc')})

print (df2)
   First  Last Ticker  Year
0      4     7      a  2013
1      5     8      a  2014
2      4     9      b  2014
3      5     4      c  2015

df = df1.merge(df2, suffixes=('_',''), on=['Ticker','Year'], how='left')
df1[['First','Last']] = (df[['First','Last']].combine_first(df[['First_','Last_']]
                                             .rename(columns=lambda x: x.strip('_'))))

print (df1)
   C  F  First  Last Ticker  Year
0  7  a    4.0   7.0      a  2013
1  8  a    4.0   9.0      b  2014
2  9  a    6.0   5.0      c  2013
3  4  b    9.0   7.0      d  2014
4  2  b    2.0   1.0      e  2013
5  3  b    4.0   0.0      f  2014

相关文章