如何合并/拼接两个不同长度的Pandas DataFrame并获取正确结果?
解决Pandas DataFrame合并匹配问题
嗨~看你的需求是要把df2里的性别信息补充到df1里对吧?我帮你梳理下解决方法:
首先先明确下df2的列名(你给的表头是0|1|2,实际对应Username、User_trim、Gender),先给df2设置正确的列名:
import pandas as pd # 模拟你的df2数据结构 df2 = pd.DataFrame([ ['Maria M', 'Maria', 'female'], ['Achim B', 'Achim', 'male'], ['Gustav W', 'Gustav', 'male'] ], index=[0,2,5], columns=['Username', 'User_trim', 'Gender'])
方法一:基于共同列(Username)左合并
这是最稳妥的方式,因为Username是两个DataFrame里唯一能精准匹配用户的标识:
# 只取df2里的Username和Gender列用来匹配,避免生成重复列 result_df = pd.merge(df1, df2[['Username', 'Gender']], on='Username', how='left')
这里用how='left'是为了保留df1里的所有行,哪怕在df2里没有匹配项(那些User_trim为N/A的用户),这些行的Gender会自动填充为NaN,如果想换成你习惯的N/A字符串,可以再加一行:
result_df['Gender'] = result_df['Gender'].fillna('N/A')
方法二:基于索引匹配(适合当前数据结构)
因为你给的df2的索引刚好和df1中对应用户的索引完全一致(0、2、5),所以也可以直接用join按索引合并:
# 提取df2的Gender列,和df1按索引左连接 result_df = df1.join(df2['Gender'], how='left') # 同样可以把NaN替换成N/A result_df['Gender'] = result_df['Gender'].fillna('N/A')
最终结果
两种方法都会得到你期望的DataFrame:
| Username | User_trim | Gender |
|---|---|---|
| Maria M | Maria | female |
| FakeName | N/A | N/A |
| Achim B | Achim | male |
| FlashMaster11 | N/A | N/A |
| Fakename2 | N/A | N/A |
| Gustav W | Gustav | male |
为啥你之前可能没得到正确结果?
大概率是这两个原因:
- 用了默认的
inner合并方式,这样只会保留两个DataFrame都有的行,直接丢掉了df1里那些没有Gender的用户 - 错误选择了匹配键,比如用
User_trim的话,df1里的N/A是字符串,而df2里没有对应值,就匹配不上;而且如果有重名的User_trim(虽然你这里没有),还会导致错误匹配
内容的提问来源于stack exchange,提问作者Nika
相关产品推荐
相关产品推荐

