如何在Pandas中以name列为筛选条件统计A1-A3列值的重复次数
解决按name分组统计多列值出现次数的问题
需求说明
现有如下数据:
| name | A1 | A2 | A3 |
|---|---|---|---|
| First | a | c | d |
| Second | b | a | a |
| First | a | c | d |
| First | a | c | d |
| First | a | c | d |
| Second | b | a | a |
需要按name列分组,统计A1至A3列中每个值(a/b/c/d)的重复次数,得到如下结果:
| name | a | b | c | d |
|---|---|---|---|---|
| First | 4 | 0 | 4 | 4 |
| Second | 4 | 2 | 0 | 0 |
解决方案代码
import pandas as pd # 构造示例数据 data = pd.DataFrame({ 'name': ['First', 'Second', 'First', 'First', 'First', 'Second'], 'A1': ['a', 'b', 'a', 'a', 'a', 'b'], 'A2': ['c', 'a', 'c', 'c', 'c', 'a'], 'A3': ['d', 'a', 'd', 'd', 'd', 'a'] }) # 步骤1:将A1-A3列转为长格式 melted_data = data.melt(id_vars='name', value_vars=['A1', 'A2', 'A3'], value_name='value') # 步骤2:按name和value分组统计数量 counts = melted_data.groupby(['name', 'value']).size().reset_index(name='count') # 步骤3:转成宽格式,填充缺失值为0 result = counts.pivot_table(index='name', columns='value', values='count', fill_value=0) # 步骤4:调整列的顺序为a、b、c、d(确保和需求格式一致) result = result[['a', 'b', 'c', 'd']].reset_index() print(result)
代码解释
- melt函数:把原宽表(A1/A2/A3为列)转成长表,每一行对应
name和某一列的取值,实现多列值的统一统计。 - groupby+size:按
name和value分组,统计每组行数,即每个值在对应name组内的出现次数。 - pivot_table:将长表转回宽表,把
value作为列,缺失的组合(比如First组没有b)填充为0,保证所有目标值都有对应列。 - 调整列顺序:确保输出列按a、b、c、d排列,匹配需求的结果格式。
输出结果
运行代码后得到:
name a b c d 0 First 4 0 4 4 1 Second 4 2 0 0
内容的提问来源于stack exchange,提问作者Init5 God
相关产品推荐
相关产品推荐

