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

如何在Pandas中按行统计元素并创建计数列?

问题描述

我创建了如下Pandas DataFrame:

import pandas as pd

ds = {'col1' : ['A','A','B','C','C','D'],
      'col2' : ['A','B','C','D','D','A']}

df = pd.DataFrame(data=ds)

输出结果:

col1 col2
0    A    A
1    A    B
2    B    C
3    C    D
4    C    D
5    D    A

已知col1和col2的取值仅为A、B、C、D,需要新增4个统计列:

  • countA:每行中A的出现次数
  • countB:每行中B的出现次数
  • countC:每行中C的出现次数
  • countD:每行中D的出现次数

最终目标DataFrame如下:

col1 col2  countA  countB  countC  countD
0    A    A       2       0       0       0
1    A    B       1       1       0       0
2    B    C       0       1       1       0
3    C    D       0       0       1       1
4    C    D       0       0       1       1
5    D    A       1       0       0       1
解决方案

方法一:哑变量聚合(高效简洁)

利用pd.get_dummies生成哑变量后按取值聚合求和,适合已知所有可能取值的场景:

# 定义目标取值列表
target_values = ['A', 'B', 'C', 'D']
# 生成哑变量并按后缀(即取值)分组求和
count_cols = pd.get_dummies(df[['col1', 'col2']]).groupby(lambda x: x[-1], axis=1).sum()
# 重命名列名
count_cols.columns = [f'count{v}' for v in target_values]
# 合并到原DataFrame
df = pd.concat([df, count_cols], axis=1)

方法二:逐行apply统计(直观易懂)

通过apply逐行处理,逻辑清晰,适合需要自定义统计规则的场景:

def count_row(row):
    return pd.Series(
        [row.eq(v).sum() for v in ['A', 'B', 'C', 'D']],
        index=['countA', 'countB', 'countC', 'countD']
    )

# 应用函数并合并结果
df = pd.concat([df, df.apply(count_row, axis=1)], axis=1)

方法三:value_counts逐行统计(扩展性强)

使用value_counts获取每行的取值频次,自动补全缺失取值的计数为0,适合取值较多的场景:

target_values = ['A', 'B', 'C', 'D']
# 逐行计算频次,填充缺失值为0
count_cols = df.apply(lambda row: row.value_counts().reindex(target_values, fill_value=0), axis=1)
# 重命名列名
count_cols.columns = [f'count{v}' for v in target_values]
# 合并到原DataFrame
df = pd.concat([df, count_cols], axis=1)

内容的提问来源于stack exchange,提问作者Giampaolo Levorato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:25:06