如何在Pandas中对多列自动化执行value_counts()并规整输出?
批量生成DataFrame所有列的value_counts分布统计
这确实是处理大维度数据集时的常见痛点!手动逐个列执行value_counts()不仅效率低,还会让notebook变得杂乱无章。给你几个实用的自动化方案,既能高效完成统计,又能让输出保持整洁:
方案1:用apply批量生成结构化统计结果
直接利用pandas的apply方法,一次性计算所有列的分布,并整理成易读的DataFrame:
import pandas as pd # 批量计算所有列的value_counts,返回一个由Series组成的字典 counts_dict = df.apply(pd.Series.value_counts) # 转置后得到每行对应原数据一列的统计DataFrame counts_df = counts_dict.T
counts_df中,每一行代表原DataFrame的一列,每一列是该列的取值,单元格数值为对应频次- 如果需要统计缺失值的数量,可以加上
dropna=False参数:df.apply(lambda x: x.value_counts(dropna=False))
方案2:循环存储/打印带标识的统计结果
如果希望保留每个列的独立统计结果,同时避免刷屏,可以将结果存入字典,或打印时添加列名分隔标识:
# 创建字典存储每个列的统计结果,方便后续调用 column_counts = {} for col in df.columns: # 计算当前列的分布,包含缺失值统计 col_stats = df[col].value_counts(dropna=False) column_counts[col] = col_stats # 打印带标识的结果,用分隔线区分不同列 print(f"--- {col} 分布统计 ---") print(col_stats) print("\n")
后续需要查看某一列的结果时,直接通过column_counts['column name']调用即可,不用重复计算。
方案3:批量生成可视化分布图表
如果想更直观地观察所有列的分布,可以循环生成柱状图,一次性展示所有结果:
import matplotlib.pyplot as plt import seaborn as sns # 设置图表布局:每行4个图,根据列数计算所需行数 total_cols = len(df.columns) rows = (total_cols + 3) // 4 # 向上取整计算行数 # 创建画布 plt.figure(figsize=(16, rows * 4)) for idx, col in enumerate(df.columns): # 子图位置 plt.subplot(rows, 4, idx + 1) # 绘制计数图 sns.countplot(data=df, x=col) # 设置标题和旋转x轴标签,防止重叠 plt.title(f"{col} 分布") plt.xticks(rotation=45) # 自动调整子图间距 plt.tight_layout() plt.show()
额外小技巧:筛选特定类型的列
如果只需要处理分类列(如object或category类型),可以先筛选列再执行统计:
# 筛选出分类类型的列 categorical_cols = df.select_dtypes(include=['object', 'category']).columns # 针对筛选后的列执行上述任意方案 for col in categorical_cols: print(f"--- {col} 分布统计 ---") print(df[col].value_counts(dropna=False)) print("\n")
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

