熊猫:如何合并两个数据框并使用第二个数据框中的值填充NaN值

时间:2020-04-19 10:26:47

标签: python pandas dataframe merge fillna

我有一个熊猫数据框(df1),如下所示:

No     car          pl.       Value      Expected      
1      Toyota       HK        0.1        0.12      
1      Toyota       NY        0.2        NaN     
2      Saab         LOS       0.3        NaN      
2      Saab         UK        0.4        0.6       
2      Saab         HK        0.5        0.51     
3      Audi         NYU       0.6        NaN      
3      Audi         LOS       0.7        NaN      
4      VW           UK        0.8        NaN   
5      Audi         HK        0.9        NaN    

我还有另一个数据帧(df2),如下所示:

No        pl.             Expected              
2         LOS              0.35      
3         NYU              0.62   
3         LOS              0.76    
5         HK               0.91     

我希望我的最终数据框看起来像这样:

No     car          pl.       Value      Expected      
1      Toyota       HK        0.1        0.12      
1      Toyota       NY        0.2        NaN     
2      Saab         LOS       0.3        0.35      
2      Saab         UK        0.4        0.6       
2      Saab         HK        0.5        0.51     
3      Audi         NYU       0.6        0.62      
3      Audi         LOS       0.7        0.76      
4      VW           UK        0.8        NaN   
5      Audi         HK        0.9        0.91    

我尝试过:

df = df1.fillna(df1.merge(df2, on=['No','pl.']))

但是df1在输出中保持不变

我在这里看到的问题是关于形状相同的数据框的。形状不同时有办法做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

由于我们要在两个关键列上进行匹配并更新df1数据框,因此我们可以将set_indexfillna一起使用,因为fillna在索引中对齐:

keys = ['No', 'pl.']
df1 = df1.set_index(keys).fillna(df2.set_index(keys)).reset_index()

   No  pl.     car  Value  Expected
0   1   HK  Toyota    0.1      0.12
1   1   NY  Toyota    0.2       NaN
2   2  LOS    Saab    0.3      0.35
3   2   UK    Saab    0.4      0.60
4   2   HK    Saab    0.5      0.51
5   3  NYU    Audi    0.6      0.62
6   3  LOS    Audi    0.7      0.76
7   4   UK      VW    0.8       NaN
8   5   HK    Audi    0.9      0.91

或者我们可以为此使用专用方法Series.update

df1 = df1.set_index(keys)
df1['Expected'].update(df2.set_index(keys)['Expected'])
df1 = df1.reset_index()

   No  pl.     car  Value  Expected
0   1   HK  Toyota    0.1      0.12
1   1   NY  Toyota    0.2       NaN
2   2  LOS    Saab    0.3      0.35
3   2   UK    Saab    0.4      0.60
4   2   HK    Saab    0.5      0.51
5   3  NYU    Audi    0.6      0.62
6   3  LOS    Audi    0.7      0.76
7   4   UK      VW    0.8       NaN
8   5   HK    Audi    0.9      0.91

答案 1 :(得分:1)

使用带有echo form_upload(array( "id" => "image", "name" => "image", "value" => $info->image )); 参数的左连接,然后用Series.fillna替换DataFrame.pop的缺失值以供使用,并删除列suffixes

Expected_