Python熊猫-加入替代

时间:2018-10-30 14:59:09

标签: python pandas

我正在尝试使用数据帧df_2中包含的值更新数据帧df_1。

df_1      
ID    B    val    val2       
0     1     2      2 
1     1     2      3
1     2     1      1
1     3     1      1
1     4     1      1

df_2      
ID    B    val    val2       
0     1     1      3 
1     1     3      3
1     3     3      3

我想要的结果在df_3中报告如下:

df_3      
ID    B    val    val2       
0     1     1      3 
1     1     3      3
1     2     1      1
1     3     3      3
1     4     1      1

您可以尽可能地使连接列为ID和B,并且在df_2中存在匹配项时,将替换这些值。关于值,df_2包含与df_1完全相同的列。

有两个问题提到该问题:Python pandas join on with overwritePython pandas - particular merge/replacement。这些问题都提到了我所遇到的完全相同的问题,但是当我尝试解决方案时,据报告联接花费了很多时间,我有一个庞大的数据集,我个人认为上述解决方案适用于小块数据。此外,这些问题还很老,所以我想知道熊猫中是否有任何新闻可以加快这一过程。

1 个答案:

答案 0 :(得分:3)

由于ID并非唯一,因此您需要使用cumcount创建其他密钥,然后对concatdrop_duplicates

df1['keys']=df1.groupby('ID').cumcount()
df2['keys']=df2.groupby('ID').cumcount()
pd.concat([df1,df2]).drop_duplicates(['ID','keys'],keep='last').drop('keys',1).sort_index()
Out[31]: 
   ID  B  val  val2
0   0  1    1     3
1   1  1    3     3
2   1  2    1     1

更新

df1.set_index(['ID','B'],inplace=True)
df1.update(df2.set_index(['ID','B']))
df1=df1.reset_index()
df1
Out[258]: 
   ID  B  val  val2
0   0  1  1.0   3.0
1   1  1  3.0   3.0
2   1  2  1.0   1.0
3   1  3  3.0   3.0
4   1  4  1.0   1.0