如何对DataFrame多列取值进行汇总统计生成频率表
实现方案
我们可以通过Python的pandas库快速完成这个频率统计需求,以下是两种可直接运行的实现方式:
方法1:逐列统计后转置(最简洁)
对每列单独统计各个值的出现次数,转置后补全缺失值即可得到目标结果,不需要手动指定统计维度,会自动识别所有出现过的分类值。
import pandas as pd # 构造原始DataFrame df = pd.DataFrame( data=[ ["A", "B", "A", "B", "A"], ["C", "B", "B", "B", "B"], ["A", "C", "A", "B", "B"] ], columns=[1,2,3,4,5] ) # 统计实现 result = df.apply(pd.Series.value_counts).T.fillna(0).astype(int) print(result)
方法2:长宽表转换后交叉统计(逻辑更清晰)
先把宽表转为「列名-值」结构的长表,再用交叉表统计频率,适合需要中间过程做额外处理的场景。
import pandas as pd # 构造原始DataFrame df = pd.DataFrame( data=[ ["A", "B", "A", "B", "A"], ["C", "B", "B", "B", "B"], ["A", "C", "A", "B", "B"] ], columns=[1,2,3,4,5] ) # 转长表 melt_df = df.melt(var_name='原始列', value_name='统计值') # 交叉统计频率 result = pd.crosstab(melt_df['原始列'], melt_df['统计值']) print(result)
两种方法输出的结果完全符合需求:
A B C 1 2 0 1 2 0 2 1 3 2 1 0 4 0 3 0 5 1 2 0
内容的提问来源于stack exchange,提问作者Dieu94
相关产品推荐
相关产品推荐

