我有一个数据框df1,并且想要合并其他(许多)数据框df2,以便:
要使用什么正确的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])
答案 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
另一种方法是将join
与fillna
一起使用:
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