按列表顺序为含重复列名的DataFrame的columns.name添加后缀
问题原因分析
你写的代码存在两个核心问题:
i.columns.name是单个字符串,不是可迭代的列集合,你用列表推导式遍历它会把字符串拆为单个字符,生成冗余列表,后续取n[x]的逻辑完全错误- 如果同一个DataFrame出现在多个分组列表中,会被多次执行拼接操作,导致后缀重复追加
正确实现
方案1:完全匹配你的预期注释逻辑(允许重复追加后缀)
如果你的需求就是按分组顺序给每个分组内的所有DataFrame追加对应后缀,允许同一个DataFrame被多次拼接(比如df2同时在cat_a和cat_b里,最终columns.name为abc_group1_group2),直接用下面的代码即可:
import pandas as pd import numpy as np # 你的数据准备代码保持不变 df1, df2, df3, df4 = (pd.DataFrame(np.random.randint(0,10,size=(10, 2)), columns=('a', 'b')), pd.DataFrame(np.random.randint(0,10,size=(10, 2)), columns=('c', 'd')), pd.DataFrame(np.random.randint(0,10,size=(10, 2)), columns=('e', 'f')), pd.DataFrame(np.random.randint(0,10,size=(10, 2)), columns=('g', 'h'))) df1.columns.name = 'abc' df2.columns.name = 'abc' df3.columns.name = 'efg' df4.columns.name = 'abc' cat_a = [df2, df1] cat_b = [df3, df2, df1] cat_c = [df1] dfs = [cat_a, cat_b, cat_c] suffix = ['group1', 'group2', 'group3'] # 核心实现 for cat, suf in zip(dfs, suffix): for df in cat: df.columns.name = f"{df.columns.name}_{suf}"
方案2:避免同一个DataFrame重复追加后缀
如果你希望每个DataFrame只追加一次后缀,取它第一次出现的分组对应的后缀,可以加个已处理标记:
processed_df = set() for cat, suf in zip(dfs, suffix): for df in cat: df_id = id(df) if df_id not in processed_df: df.columns.name = f"{df.columns.name}_{suf}" processed_df.add(df_id)
内容的提问来源于stack exchange,提问作者siash
相关产品推荐
相关产品推荐

