pandas如何按分组统计符合列表条件的唯一SP值数量并新增列
实现方法
你可以用以下两种pandas方案实现需求,第二种逻辑更直观、运行效率更高:
前置准备
首先导入依赖、构造示例数据:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Groups': ['G1','G1','G1','G1','G1','G1','G2','G2','G2','G2'], 'SP': ['SP1','SP1','SP1','SP2','SP3','SP4','SP2','SP5','SP3','SP23'], 'Letters': ['A','Z','A','X','X','B','A','B','X','A'] }) the_list = ['A','B']
方案1:groupby + transform 直接赋值
df['Nb_column'] = df.groupby('Groups')['SP'].transform( lambda x: x[df.loc[x.index, 'Letters'].isin(the_list)].nunique() )
逻辑说明:对每个Groups分组的SP序列,通过索引匹配对应行的Letters值,筛选出属于the_list的部分后,统计对应SP的唯一值个数,transform会把统计值广播到当前分组的所有行。
方案2:先做分组统计再映射(推荐)
# 先筛选符合条件的行,按分组统计SP的唯一值个数,生成映射关系 count_map = df[df['Letters'].isin(the_list)].groupby('Groups')['SP'].nunique() # 将统计值映射到原表的对应分组 df['Nb_column'] = df['Groups'].map(count_map)
逻辑说明:先过滤掉所有Letters不在目标列表里的行,直接统计每个分组的SP唯一值个数,再把结果映射回原表,避免分组内重复计算,更适合大数据量场景。
运行以上任意一种方案后,得到的df就和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

