如何在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
相关产品推荐
相关产品推荐

