下面是 处理 DataFrame 列名 的常用方式总结,涵盖单层级列名与**多层级列名(MultiIndex)**的统一和拼接策略:
🔹 1. 保留原始列名(适用于单层或已清洗好的列名)
# 保持不变
df.columns = df.columns
🔹 2. 只保留多层级列名中的第一个层级(例如:只保留 'A')
df.columns = df.columns.map(lambda x: x[0] if isinstance(x, tuple) else x)
📌 示例:
[('A', 'mean'), ('A', 'std'), ('B', 'mean')] → ['A', 'A', 'B']
🔹 3. 多层级列名拼接为无分隔的字符串
df.columns = df.columns.map(lambda x: ''.join(x) if isinstance(x, tuple) else x)
📌 示例:
[('A', 'mean'), ('A', 'std'), ('B', 'mean')] → ['Amean', 'Astd', 'Bmean']
🔹 4. 多层级列名拼接为有分隔的字符串(推荐 ✅)
df.columns = df.columns.map(lambda x: '_'.join(filter(None, x)) if isinstance(x, tuple) else x)
📌 示例:
[('A', 'mean'), ('A', 'std'), ('B', 'mean'), ('C', '')] → ['A_mean', 'A_std', 'B_mean', 'C']
优势:
- 清晰可读
- 避免空字符串引发的尾部下划线(如
'C_'
)
✅ 建议封装成函数:
def flatten_columns(df, sep='_'):
df.columns = df.columns.map(
lambda x: sep.join(filter(None, x)) if isinstance(x, tuple) else x
)
return df
使用方法:
df = flatten_columns(df, sep='') # → 'Amean'
df = flatten_columns(df, sep='_') # → 'A_mean'
df = flatten_columns(df, sep='-') # → 'A-mean'