繁体   English   中英

如何根据列的值获取另一个数据框的值并将其设置为相应的字段

[英]How to get another dataframe value according to the value of the column and set to the corresponding field

这是我的两个数据框,

df1 = pd.DataFrame([['@1','A',2],['@2','A',1],['@3','A',4],['@4','B',1],['@5','B',1],['@6','B',3],['@7','B',3],['@8','C',4]],columns=['key1','key2','value'])

  key1 key2  value
0   @1    A      2
1   @2    A      1
2   @3    A      4
3   @4    B      1
4   @5    B      1
5   @6    B      3
6   @7    B      3
7   @8    C      4

df2 = pd.DataFrame([['@5','B',None],['@7','B',None],['@6','B',None],['@3','A',None],['@6','B',None]],columns=['key1','key2','value'])

  key1 key2 value
0   @5    B  None
1   @7    B  None
2   @6    B  None
3   @3    A  None
4   @6    B  None

我知道我可以使用isin选择key1 + key2在df2中的df1的行

df1[(df1['key1']+df1['key2']).isin(df2['key1']+df2['key2'])]

  key1 key2  value
2   @3    A      4
4   @5    B      1
5   @6    B      3
6   @7    B      3

但是我怎样才能将df1的['value']分配给df2,所以让df2为

  key1 key2 value
0   @5    B  1
1   @7    B  3
2   @6    B  3
3   @3    A  4
4   @6    B  3

使用pd.DataFrame.merge

df2[['key1', 'key2']].merge(df1, 'left')

  key1 key2  value
0   @5    B      1
1   @7    B      3
2   @6    B      3
3   @3    A      4
4   @6    B      3

或与pd.DataFrame.join

keys = ['key1', 'key2']
df2[keys].join(df1.set_index(keys).value, on=keys)

  key1 key2  value
0   @5    B      1
1   @7    B      3
2   @6    B      3
3   @3    A      4
4   @6    B      3

假设您想更新df2同时保持其他列不变。 您可以就地update

keys = ['key1', 'key2']
df2.update(df2[keys].join(df1.set_index(keys).value, on=keys).value)

或创建副本

keys = ['key1', 'key2']
df2.assign(value=df2[keys].join(df1.set_index(keys).value, on=keys).value)

或者您可以使用fillna

df2.set_index(['key1','key2']).value.fillna(df1.set_index(['key1','key2']).value).\
        reset_index()
Out[84]: 
  key1 key2  value
0   @5    B      1
1   @7    B      3
2   @6    B      3
3   @3    A      4
4   @6    B      3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM