Merge Pandas Dataframe:如何添加列和替换值
Merge Pandas Dataframe: how to add columns and replace values
我有一个数据框 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])
一种方法是使用 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 per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df1a = df1.reindex(df1.columns.union(df2.columns), axis=1)
df1a.update(df2)
df1a
2.93 ms ± 133 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df1[['A','B']].join(df2).fillna(df1)
5.2 ms ± 89.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df2.combine_first(df1)
5.37 ms ± 127 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
首先合并是这里的正确方法,另一种选择是连接并从组 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
我有一个数据框 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])
一种方法是使用 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 per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df1a = df1.reindex(df1.columns.union(df2.columns), axis=1)
df1a.update(df2)
df1a
2.93 ms ± 133 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df1[['A','B']].join(df2).fillna(df1)
5.2 ms ± 89.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df2.combine_first(df1)
5.37 ms ± 127 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
首先合并是这里的正确方法,另一种选择是连接并从组 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