合并熊猫数据框:如何添加列和替换值

时间:2020-06-13 05:27:20

标签: pandas join merge concat

我有一个数据框df1,并且想要合并其他(许多)数据框df2,以便:

  • 合并发生在匹配的(多个)索引上
  • 如果缺少则创建新列
  • 如果该列已存在,则替换值

enter image description here

要使用什么正确的pandas操作以及带有哪些参数?我查看了concat / join / merge / assign / append,但没有找到它。

数据框代码:

df1 = pd.DataFrame({'A':['A1', 'A2', 'A3', 'A4'],
                    'B':['B1', 'B2' ,'B3', 'B4'],
                    'C':['C1' ,'C2', 'C3', 'C4']},
                  index = [1,2,3,4])

df2 = pd.DataFrame({'C':['NewC'], 'D':['NewD']},
                  index=[3])

2 个答案:

答案 0 :(得分:3)

一种方法是使用combine_first

df2.combine_first(df1)

输出:

    A   B     C     D
1  A1  B1    C1   NaN
2  A2  B2    C2   NaN
3  A3  B3  NewC  NewD
4  A4  B4    C4   NaN

另一种方法是将joinfillna一起使用:

df1[['A','B']].join(df2).fillna(df1)

输出:

    A   B     C     D
1  A1  B1    C1   NaN
2  A2  B2    C2   NaN
3  A3  B3  NewC  NewD
4  A4  B4    C4   NaN

第三种方式,

df1a = df1.reindex(df1.columns.union(df2.columns), axis=1)
df1a.update(df2)
df1a

时间:

%%timeit pd.concat((df1,df2),sort=False).groupby(level=0).last()  

每个循环4.56 ms±947 µs(平均±标准偏差,共运行7次,每个循环100个循环)

%%timeit 
df1a = df1.reindex(df1.columns.union(df2.columns), axis=1)  
df1a.update(df2)
df1a

每个循环2.93 ms±133 µs(平均±标准偏差,共运行7次,每个循环100个循环)

%timeit df1[['A','B']].join(df2).fillna(df1)

每个循环5.2 ms±89.7 µs(平均±标准偏差,共运行7次,每个循环100个循环)

%timeit df2.combine_first(df1)

每个循环5.37 ms±127 µs(平均±标准偏差,共运行7次,每个循环100个循环)

答案 1 :(得分:2)

这里首先合并是正确的方法,另一种替代方法是concat并从level=0组(索引)获取最后一个:

pd.concat((df1,df2),sort=False).groupby(level=0).last()

或与df.assign

df1.assign(**df2).fillna(df1)

    A   B     C     D
1  A1  B1    C1   NaN
2  A2  B2    C2   NaN
3  A3  B3  NewC  NewD
4  A4  B4    C4   NaN