如何在Pandas DataFrame中按行统计不同值并新增计数列
按行统计Pandas DataFrame值出现次数并新增统计列
问题
我有一个多列多行的Pandas DataFrame,想要按行统计每行中各值的出现次数,并且为每个值的统计结果新增一列。
原始DataFrame:
Col1 Col2 Col3 2 2 1 1 1 1 3 1 2
期望输出:
Col1 Col2 Col3 Count1 Count2 Count3 2 2 1 1 2 0 1 1 1 3 0 0 3 1 2 1 1 1
解决方案
方法1:逐行统计(代码简洁)
利用apply对每行做值计数,再通过reindex统一统计列,最后和原表拼接:
import pandas as pd # 初始化原始数据 df = pd.DataFrame({ 'Col1': [2, 1, 3], 'Col2': [2, 1, 1], 'Col3': [1, 1, 2] }) # 指定要统计的数值(这里自动提取所有唯一值并排序,也可手动写[1,2,3]) target_values = sorted(df.stack().unique()) # 每行统计值出现次数,缺失值补0 count_df = df.apply( lambda row: row.value_counts().reindex(target_values, fill_value=0), axis=1 ) # 重命名统计列 count_df.columns = [f'Count{v}' for v in target_values] # 拼接原表和统计结果 final_df = pd.concat([df, count_df], axis=1) print(final_df)
方法2:向量式操作(大数据集更高效)
避免逐行循环,用melt转长表后分组统计,适合数据量较大的场景:
import pandas as pd df = pd.DataFrame({ 'Col1': [2, 1, 3], 'Col2': [2, 1, 1], 'Col3': [1, 1, 2] }) # 添加行索引用于分组 df['row_idx'] = df.index # 宽表转长表 melted_df = df.melt(id_vars='row_idx', value_vars=['Col1', 'Col2', 'Col3']) # 按行和值分组计数,转宽表并补0 count_df = melted_df.groupby(['row_idx', 'value']).size().unstack(fill_value=0) # 重命名列 count_df.columns = [f'Count{v}' for v in count_df.columns] # 合并原表和统计结果,删除临时索引列 final_df = df.merge(count_df, left_index=True, right_index=True).drop('row_idx', axis=1) print(final_df)
注意事项
- 如果只需要统计特定数值,直接替换
target_values为指定列表即可,比如target_values = [1,2]就只会生成Count1和Count2列。 - 方法2的效率更高,因为Pandas的向量式操作比逐行
apply快很多,数据量大时优先选这个。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

