如何使用Pandas合并含重复值的列并按UserId分组统计
Pandas按UserId分组统计域名数量并拼接域名实现方案
原代码存在两个问题:
groupby传参错误:该方法仅接收分组字段作为入参,你把待聚合的DomainId也传入了分组参数,会导致按两列做联合分组,不符合单按UserId分组的需求- 聚合方法选择错误:
sum()仅支持数值求和,无法同时实现计数、字符串拼接的聚合逻辑
可直接运行的实现代码
import pandas as pd # 读取源csv文件 df = pd.read_csv('User_Domains.csv') # 分组聚合,sort=False用于保留UserId在源文件中首次出现的顺序,和期望输出顺序一致 df_result = df.groupby('UserId', as_index=False, sort=False).agg( NumDomains=('DomainId', 'count'), Domains=('DomainId', lambda x: '|'.join(x)) ) # 打印查看结果 print(df_result) # 如需导出为csv文件,取消注释下一行即可,index=False表示不导出行索引 # df_result.to_csv('result.csv', index=False)
代码说明
as_index=False:禁止将分组字段UserId设为行索引,保留为普通数据列,匹配期望输出的表结构agg()内定义两个聚合规则:NumDomains=('DomainId', 'count'):统计每个UserId分组下的DomainId总数,对应该用户关联的域名数量Domains=('DomainId', lambda x: '|'.join(x)):将分组下所有DomainId值用|拼接为单个字符串
运行后输出结果和需求完全一致:
UserId NumDomains Domains 0 TestTraderCAD 2 ALL|CAD 1 TestTraderUSD 2 ALL|USD 2 TestTraderGBP 2 ALL|GBP
内容的提问来源于stack exchange,提问作者emmon simbo
相关产品推荐
相关产品推荐

