Pandas统计DataFrame各分组匹配指定列表的元素数并新增列
Pandas 分组统计指定列表内元素个数实现
首先导入依赖、加载测试数据:
import pandas as pd # 定义目标匹配列表 The_list = ["A", "B", "D"] # 加载测试数据集 df = pd.DataFrame({ 'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G2', 5: 'G2', 6: 'G2', 7: 'G3', 8: 'G3', 9: 'G4', 10: 'G4', 11: 'G4', 12: 'G4'}, 'Values': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'A', 5: 'B', 6: 'A', 7: 'A', 8: 'D', 9: 'Z', 10: 'D', 11: 'E', 12: 'C'} })
实现逻辑
- 逐行判断
Values列的值是否属于The_list,匹配成功标记为1,否则标记为0 - 按
Groups列分组做聚合统计,同组所有行填充相同的聚合结果 - 用
groupby搭配transform可以直接生成和原表长度一致的统计列,不需要额外做表关联,代码最简洁
实现代码
场景1:统计分组内匹配元素总个数(重复值计入统计)
df['New_column'] = df['Values'].isin(The_list).groupby(df['Groups']).transform('sum')
运行后输出结果:
Groups Values New_column 0 G1 A 3 1 G1 B 3 2 G1 C 3 3 G1 D 3 4 G2 A 3 5 G2 B 3 6 G2 A 3 7 G3 A 2 8 G3 D 2 9 G4 Z 1 10 G4 D 1 11 G4 E 1 12 G4 C 1
场景2:统计分组内匹配元素的去重唯一值个数
如果需要重复值只算一次,用如下代码即可:
df['New_column'] = df.groupby('Groups')['Values'].transform(lambda x: x[x.isin(The_list)].nunique())
运行后输出结果:
Groups Values New_column 0 G1 A 3 1 G1 B 3 2 G1 C 3 3 G1 D 3 4 G2 A 2 5 G2 B 2 6 G2 A 2 7 G3 A 2 8 G3 D 2 9 G4 Z 1 10 G4 D 1 11 G4 E 1 12 G4 C 1
注:你提供的期望输出中G3、G4的统计值和给定
The_list的匹配规则不符,可根据实际业务规则调整判断条件即可。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

