You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:35:21