基于pandas实现DataFrame按key列合并的方法咨询
解决DataFrame全外连接合并问题
先还原你的两个示例DataFrame:
import pandas as pd # 第一个DataFrame df1 = pd.DataFrame({ 'key': ['abc', 'bcd'], 'Apple': [1, 23], 'Banana': [12, 21] }) # 第二个DataFrame df2 = pd.DataFrame({ 'key': ['abc', 'jkn'], 'Train': [11, 2], 'Car': [20, 19] })
你用pd.concat没得到预期结果,是因为它是按行/轴直接拼接,不会根据key列做匹配对齐。要实现保留所有key、缺失字段按需填充的需求,应该用pd.merge做全外连接,以下是具体实现:
方法1:保留缺失值(NA)
直接调用merge并指定how='outer',会保留两个DataFrame中所有的key值,不匹配的字段自动填充为NaN:
merged_df = pd.merge(df1, df2, on='key', how='outer')
输出结果:
| key | Apple | Banana | Train | Car |
|---|---|---|---|---|
| abc | 1.0 | 12.0 | 11.0 | 20.0 |
| bcd | 23.0 | 21.0 | NaN | NaN |
| jkn | NaN | NaN | 2.0 | 19.0 |
方法2:缺失值填充为0
如果需要把NaN替换成0,在merge后调用fillna(0)即可:
merged_df_with_0 = pd.merge(df1, df2, on='key', how='outer').fillna(0)
输出结果:
| key | Apple | Banana | Train | Car |
|---|---|---|---|---|
| abc | 1 | 12 | 11 | 20 |
| bcd | 23 | 21 | 0 | 0 |
| jkn | 0 | 0 | 2 | 19 |
为什么pd.concat不适用?
举个例子,若用pd.concat([df1, df2], axis=1),会按索引拼接,导致bcd和jkn的字段错位;若用axis=0则是行堆叠,key会重复,完全达不到按key匹配合并的效果。这种按指定键做全量匹配的场景,merge才是正确选择。
内容的提问来源于stack exchange,提问作者Bhavya Budhia
相关产品推荐
相关产品推荐

