如何用较小数据框中的单元格替换较大 Pandas 数据框中的单元格
How to replace cells in a larger Pandas dataframe with cells from a smaller dataframe
我有两个 pandas 数据帧:
更小:
更大:
我想匹配代码和年份,然后将第一列和最后一列中的数字替换为较小数据框中的数字。
我试过使用 pd.merge,但我只成功地添加了行或列,而没有替换特定的单元格。有人可以 post 一些可以实现此目的的代码吗?
您可以使用 merge
with left join and suffixes
and then combine_first
重命名以删除 _
:
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
我有两个 pandas 数据帧:
更小:
更大:
我想匹配代码和年份,然后将第一列和最后一列中的数字替换为较小数据框中的数字。
我试过使用 pd.merge,但我只成功地添加了行或列,而没有替换特定的单元格。有人可以 post 一些可以实现此目的的代码吗?
您可以使用 merge
with left join and suffixes
and then combine_first
重命名以删除 _
:
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