我有两个数据帧,df1
和df2
。
df1
是抓取的数据:
Name ID Symbol
0 AAA 23135106
1 Bbb G06242104 String2
2 Ccc 30303M102 String3
3 DDD 2079K305
4 2079K107
df2
是参考数据:
Name ID Symbol
0 Aaa 23135106 String1
1 Bbb G06242104 String2
2 Ccc 98980L101 String3
3 Ddd 2079K305 String4
4 Eee 2079K107 String5
5 Fff 287Y109 String6
6 Ggg 380105 String7
7 Hhh G00349103 String8
我要使用ID
作为键,
Symbols
中的空值填充Names
中的空df1
和df2
,并且Names
中格式错误的(例如AAA与Aaa)df1
替换为df2
中的格式,使最终结果看起来像:
Name ID Symbol
0 Aaa 23135106 String1
1 Bbb G06242104 String2
2 Ccc 30303M102 String3
3 Ddd 2079K305 String4
4 Eee 2079K107 String5
答案 0 :(得分:0)
fillna
和map
是您所需要的:
df1['Symbol'] = df1.Symbol.fillna(df1.ID.map(df2.set_index('ID').Symbol))
输出:
Name ID Symbol
0 AAA 23135106 String1
1 Bbb G06242104 String2
2 Ccc 30303M102 String3
3 DDD 2079K305 String4
4 EEE 2079K107 String5
答案 1 :(得分:0)
我认为您只需要DataFrame.merge
+ DataFrame.fillna
:
df1[['Name','ID']].merge(df2[['ID','Symbol']],on='ID',how = 'left').fillna(df1)
Name ID Symbol
0 AAA 23135106 String1
1 Bbb G06242104 String2
2 Ccc 30303M102 String3
3 DDD 2079K305 String4
4 EEE 2079K107 String5
或
( df1[['ID']].merge(df2[['Name','ID','Symbol']],on='ID',how = 'left')
.fillna(df1)
.reindex(columns = df1.columns) )
Name ID Symbol
0 Aaa 23135106 String1
1 Bbb G06242104 String2
2 Ccc 30303M102 String3
3 Ddd 2079K305 String4
4 Eee 2079K107 String5
答案 2 :(得分:0)
如果您需要同时更新Name
和Symbol
,则需要update
和切片分配
df1_1 = df1.set_index('ID')
df1_1.update(df2.set_index('ID'))
df1.loc[df1.Symbol == '', ['Name', 'Symbol']] = df1_1.reset_index()
Out[1238]:
Name ID Symbol
0 Aaa 23135106 String1
1 Bbb G06242104 String2
2 Ccc 30303M102 String3
3 Ddd 2079K305 String4
4 Eee 2079K107 String5