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)
一种方法是使用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 次循环)
| 归档时间: |
|
| 查看次数: |
1092 次 |
| 最近记录: |