示例数据: 这是我的数据框的简化表示:
我的第一个数据框(df1)就像:
col1 | col2 | col3 | col4 | 第5栏 |
---|---|---|---|---|
1 | 2 | a | 3 | 4 |
11 | 22 | 啊 | 33 | 44 |
111 | 222 | 啊啊 |
我的第二个数据框(df2)类似于:
col3 | col4 | 第5栏 |
---|---|---|
a | 3 | 4 |
啊 | 332 | 442 |
啊啊 | 333 | 444 |
我希望我的合并数据框(result_df)看起来像:
col1 | col2 | col3 | col4 | 第5栏 |
---|---|---|---|---|
1 | 2 | a | 3 | 4 |
11 | 22 | 啊 | 33 | 44 |
11 | 22 | 啊 | 332 | 442 |
111 | 222 | 啊啊 | 333 | 444 |
我尝试将 pd.merge 函数与左连接一起使用:
result_df = pd.merge(df1, df2, on='col3', how='left')
result_df 看起来像:
col1 | col2 | col3 | col4_x | col5_x | col4_y | col5_y |
---|---|---|---|---|---|---|
1 | 2 | a | 3 | 4 | 3 | 4 |
11 | 22 | 啊 | 33 | 44 | 332 | 442 |
111 | 222 | 啊啊 | 333 | 444 |
我试图理解为什么生成的数据框有额外的列以及如何实现所需的输出。非常感谢任何帮助或见解。
这就是
merge
的工作原理。您通常会在 merge
调用之后进行投影,以按照您喜欢的方式组织列:
result_df = (
pd.merge(df1, df2, on='col3', how='left')
.drop(columns=['col4_x', 'col5_x'])
.rename(columns={'col4_y': 'col4', 'col5_y': 'col5'})
)
您可以通过为一侧指定空后缀来保存
rename
步骤:
result_df = (
pd.merge(df1, df2, on='col3', how='left', suffixes=('_x', None))
.drop(columns=['col4_x', 'col5_x'])
)
如果保留数据的标准不像“只删除一侧”那么简单,则必须使用特定逻辑重新创建
col4
和 col5
:
result_df = pd.merge(df1, df2, on='col3', how='left')
result_df['col4'] = result_df[['col4_x', 'col4_y']].min(axis=1)
result_df['col5'] = result_df.apply(mylogic, axis=1)
result_df.drop(columns=['col4_x', 'col4_y', 'col5_x', 'col5_y'], inplace=True)