
将 df.describe() 的多行统计结果(如 mean、std、min、max)重塑为单行 DataFrame,列名为 "列名-统计量"(如 Height-mean),便于批量处理千个文件并汇总到 CSV 中进行横向分析。
将 `df.describe()` 的多行统计结果(如 mean、std、min、max)重塑为单行 dataframe,列名为 `"列名-统计量"`(如 `height-mean`),便于批量处理千个文件并汇总到 csv 中进行横向分析。
在数据分析流水线中,尤其是处理大量同构结构的实验或日志文件(例如 1000 个含 13 列、50–200 行的传感器数据文件)时,常需对每个文件快速提取描述性统计,并统一汇入一张宽表(wide-format table)用于后续筛选、建模或可视化。pandas.DataFrame.describe() 默认输出是「统计量为行索引、原始列为列」的长格式(如 Height 列下有 mean, std, min 等多行),但下游工具(如 Excel、BI 平台)或批量比较场景更倾向单数据行 + 自解释列名的结构——即每列形如 Height-mean、Weight-std,整张表仅含 1 行数值。
实现该转换的核心思路是:打破原 DataFrame 的行列逻辑,将 (列名, 统计量) 组合成新列名,并将所有统计值展平为一维数组。以下是两种高效、健壮的实现方式:
✅ 方法一:unstack() + to_frame().T + 列名映射(推荐)
import pandas as pd
# 示例数据(模拟 df.describe() 输出)
df_desc = pd.DataFrame({
'Height': [5.0, 2.0, 3.0, 7.0],
'Weight': [8.0, 1.0, 5.0, 10.0],
'Mass': [12.0, 3.0, 6.0, 13.5]
}, index=['mean', 'std', 'min', 'max'])
# 转换为单行宽格式
out = df_desc.unstack().to_frame().T
out.columns = out.columns.map(lambda x: f'{x[0]}-{x[1].lower()}') # 小写统计量更规范
print(out)输出:
Height-mean Height-std Height-min Height-max Weight-mean Weight-std \ 0 5 2 3 7 8 1 Weight-min Weight-max Mass-mean Mass-std Mass-min Mass-max 0 5 10 12.0 3.0 6.0 13.5
✅ 优势:语义清晰、链式可读;自动保留原始索引/列顺序;兼容 describe(include='all') 等扩展统计。
✅ 方法二:MultiIndex.from_product + ravel('F')(高性能替代)
import numpy as np
# 构造列名组合(列 × 统计量),按列优先(Fortran order)展平数值
cols = [f'{col}-{idx.lower()}' for col in df_desc.columns for idx in df_desc.index]
values = df_desc.values.T.ravel() # 等价于 ravel('F'),确保 Height 所有统计先出现
out = pd.DataFrame([values], columns=cols)
print(out)⚡ 优势:纯 NumPy 操作,大数据量时性能更优;无索引操作开销。
? 关键注意事项
统计量命名大小写:describe() 默认索引为 'count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max'。建议统一转小写(.lower())以提升可读性与一致性。
缺失值处理:若某列含非数值类型,describe() 可能返回部分统计量(如仅 count, unique)。此时需提前用 describe(include=[np.number]) 过滤,避免列名不一致。
-
批量处理模板:
all_results = [] for file_path in file_list: df = pd.read_csv(file_path) desc = df.describe(include=[np.number]) flat_row = desc.unstack().to_frame().T flat_row.columns = flat_row.columns.map(lambda x: f'{x[0]}-{x[1].lower()}') flat_row['source_file'] = file_path # 记录来源 all_results.append(flat_row) final_df = pd.concat(all_results, ignore_index=True) final_df.to_csv('all_describe_summary.csv', index=False)
通过上述任一方法,你即可将每个文件的统计摘要压缩为一行,轻松构建千级文件的横向对比表——无论是定位 Mass-max 最高的样本,还是筛选 Height-std 最小的稳定批次,都只需一次 pandas 查询,大幅提升分析效率。

















