Pandas合并列数可变且索引含重复值的DataFrame问题求助
问题根因
- 当b为单个字符串类型(比如你注释里的
b = 'parrot')时,len(b)返回的是字符串的字符长度,而非你期望的列数量,会错误进入len(b)>1的分支,把字符串拆分为单个字符作为列名提取df2子集,自然会因为列不存在报错。 - 多余的分支逻辑其实没有必要,不管选几列都可以统一处理,不需要做分支判断。
修复方案
首先统一把b转换成列表类型,保证不管输入是单个列名字符串还是多个列名的元组/列表,都能正确提取df2的子集,代码可以简化为:
import pandas as pd df1 = pd.DataFrame(data={'cat':[0,2,1], 'dog':[1,2,3]}).set_index([pd.Index([2, 2, 4])]) df2 = pd.DataFrame(data={'mouse':[1,2,3],'parrot':[0,1,2],'elephant':[0,1,2]}).set_index([pd.Index([1, 2, 4])]) # 不管b是单个字符串还是多个列名的元组/列表,先统一转成列表 # 单个列名的情况示例:b = 'parrot' b = ('parrot', 'mouse') # 统一处理,不需要分支判断 cols = [b] if isinstance(b, str) else list(b) out = df1.merge(df2[cols], left_index=True, right_index=True)
结果验证
运行后输出的out会保留所有重复索引,符合你的需求:
cat dog parrot mouse 2 0 1 1 2 2 2 2 1 2 4 1 3 2 3
补充说明:你提到的“索引有重复不能用pd.concat”其实是误解,如果需求只是按索引对齐合并保留重复索引,pd.concat([df1, df2[cols]], axis=1, join='inner')也能得到完全一样的结果,不会去重索引,你可以按需选择。
内容的提问来源于stack exchange,提问作者siash
相关产品推荐
相关产品推荐

