合并 Pandas Dataframe:如何添加列和替换值

Phi*_*ipp 1 merge join concat pandas

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

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

在此处输入图片说明

要使用的正确熊猫操作是什么以及使用什么参数?我查看了 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])
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 5

一种方法是使用combine_first

df2.combine_first(df1)
Run Code Online (Sandbox Code Playgroud)

输出:

    A   B     C     D
1  A1  B1    C1   NaN
2  A2  B2    C2   NaN
3  A3  B3  NewC  NewD
4  A4  B4    C4   NaN
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用joinwith fillna

df1[['A','B']].join(df2).fillna(df1)
Run Code Online (Sandbox Code Playgroud)

输出:

    A   B     C     D
1  A1  B1    C1   NaN
2  A2  B2    C2   NaN
3  A3  B3  NewC  NewD
4  A4  B4    C4   NaN
Run Code Online (Sandbox Code Playgroud)

第三种方式,

df1a = df1.reindex(df1.columns.union(df2.columns), axis=1)
df1a.update(df2)
df1a
Run Code Online (Sandbox Code Playgroud)

时间:

%%timeit pd.concat((df1,df2),sort=False).groupby(level=0).last()  
Run Code Online (Sandbox Code Playgroud)

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

%%timeit 
df1a = df1.reindex(df1.columns.union(df2.columns), axis=1)  
df1a.update(df2)
df1a
Run Code Online (Sandbox Code Playgroud)

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

%timeit df1[['A','B']].join(df2).fillna(df1)
Run Code Online (Sandbox Code Playgroud)

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

%timeit df2.combine_first(df1)
Run Code Online (Sandbox Code Playgroud)

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