如何用另一个数据框的索引替换一个数据框的空白索引

时间:2019-12-30 17:42:05

标签: python pandas

我有两个数据帧,df1df2

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作为键,

  1. Symbols中的空值填充Names中的空df1df2,并且
  2. 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

3 个答案:

答案 0 :(得分:0)

fillnamap是您所需要的:

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)

如果您需要同时更新NameSymbol,则需要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