2017-09-13 65 views
2

我有两个数据帧,我试图合并。组合来自熊猫数据框的列的问题

   df1 
    code scale R1 R2... 
0 121  1  80 110 
1 121  2  NaN NaN 
2 121  3  NaN NaN 
3 313  1  60 60 
4 313  2  NaN NaN 
5 313  3  NaN NaN 
... 
      df2 
    code scale R1 R2... 
0 121  2  30 20 
3 313  2  15 10 
... 

我需要的基础上,列codescale平等的值复制从df2df1

结果应该是这样的:

   df1 
    code scale R1 R2... 
0 121  1  80 110 
1 121  2  30 20 
2 121  3  NaN NaN 
3 313  1  60 60 
4 313  2  15 10 
5 313  3  NaN NaN 
... 

的问题是,可以有很多列的像R1R2,我不能单独检查每一个,所以我想用的东西​​,但没有任何结果给我。我做错了什么,但我不明白。我真的需要建议。

+2

如果两个数据帧都具有R1/R2的值,您希望发生什么?如果你想保留df1,你可以做'df1.set_index(['code','scale'])。fillna(df2.set_index(['code','scale']))。reset_index()' –

+0

@KenSyme why你不是回答吗? – IanS

回答

4

要HAP做什么如果两个数据帧都具有R1/R2的值,那么这个笔是笔吗?如果你想保持DF1,你可以做

df1.set_index(['code', 'scale']).fillna(df2.set_index(['code', 'scale'])).reset_index() 

为了保持DF2只是做fillna其他方式轮。以其他方式结合,请澄清问题!

+0

感谢您的回答!我忘记提及'df1'中的值,除了'scale'为'1'的行以外总是空的。实际上,我想用'df2'和其他数据框填充数据。 –

3

试试这个吗?

pd.concat([df,df1],axis=0).sort_values(['code','scale']).drop_duplicates(['code','scale'],keep='last')  
Out[21]: 
    code scale R1  R2 
0 121  1 80.0 110.0 
0 121  2 30.0 20.0 
2 121  3 NaN NaN 
3 313  1 60.0 60.0 
3 313  2 15.0 10.0 
5 313  3 NaN NaN 
3

对于combine_first这是一个很好的情况。它从传递的数据帧中替换调用数据帧中的空值。

df1.set_index(['code', 'scale']).combine_first(df2.set_index(['code', 'scale'])).reset_index() 

    code scale R1  R2 
0 121  1 80.0 110.0 
1 121  2 30.0 20.0 
2 121  3 NaN NaN 
3 313  1 60.0 60.0 
4 313  2 15.0 10.0 
5 313  3 NaN NaN 

其他解决方案

with fillna

df.set_index(['code', 'scale']).fillna(df1.set_index(['code', 'scale'])).reset_index() 

with add - 快一点

df.set_index(['code', 'scale']).add(df1.set_index(['code', 'scale']), fill_value=0)