pandas用pd.concat拼接含字符串列DataFrame报Expected tuple错误怎么办
报错核心原因
这个错误几乎都是不同sub_df的列索引(columns)的元素类型不统一导致的,结合你的场景具体触发逻辑如下:
- 你原始的sub_df的n1~n1000列的列名是
tuple类型:这类情况常见于你之前对数据做过pivot透视、多级索引列重置、或者读取了带复合表头的数据源,每一列的列名都是类似('n1',)、('n2',)的元组格式。 - 你新增
special_string列时,直接用了字符串作为列名:sub['x10081'] = some_value_i这个操作本身合法,但会让当前sub_df的列索引里同时存在tuple类型的旧列名、和string类型的新列名。 pd.concat拼接时会自动对齐所有输入df的列索引,当它尝试用tuple格式去匹配string类型的列名时,就会抛出TypeError: Expected tuple, got str的错误。你删除该列后所有列名都是tuple类型,类型统一就可以正常拼接,完全符合这个特征。
修复方案
你可以任选一种统一列名类型的方案,在拼接前对每个sub_df执行:
- 方案1:把所有列名统一转为字符串(最简单通用)
sub_df.columns = [str(col) for col in sub_df.columns]
- 方案2:把原始tuple列名转为普通字符串列名,保留原命名习惯
# 假设原始tuple列名只有一个元素 sub_df.columns = [col[0] if isinstance(col, tuple) else col for col in sub_df.columns]
- 方案3:新增列时保持和原始列名相同的tuple类型
# 替换你原来的新增列代码,列名用tuple格式 sub[('special_string',)] = some_value_i
执行完之后再调用pd.concat(sub_df_list)就可以正常拼接。
内容的提问来源于stack exchange,提问作者nilsinelabore
相关产品推荐
相关产品推荐

