Pandas中分组求和并获取唯一值对的实现方法
解决方法:按ID分组求和并获取唯一值对
你之前用transform的方式确实会给每个id的所有记录重复对应总和值,想要得到唯一的id和sum_values配对其实很简单,这里有两种实用方法:
方法一:直接分组聚合(更高效)
这是最直接的思路,不需要给每条记录都添加总和,直接对id分组后计算dnm的总和,再筛选符合条件的记录:
import pandas as pd import numpy as np # 保留你原有的数据读取逻辑 data = pd.read_csv(file_name, sep='\t', header=0, parse_dates=[1], infer_datetime_format=True) # 分组求和 + 重命名列 + 筛选 result = data.groupby('id')['dnm'].sum().reset_index(name='sum_values') result = result[result['sum_values'] > 300]
逻辑说明:
groupby('id')['dnm'].sum():直接按id分组,计算每组dnm的总和,返回一个以id为索引的Seriesreset_index(name='sum_values'):把索引转为普通列,并给总和列命名为sum_values- 最后一行筛选出
sum_values大于300的记录,得到的就是唯一的id与对应总和的配对
方法二:基于你原代码修改(保留原有逻辑)
如果你想沿用之前用transform的思路,只需要在筛选后保留需要的列并去除重复行即可:
import pandas as pd import numpy as np data = pd.read_csv(file_name, sep='\t', header=0, parse_dates=[1], infer_datetime_format=True) test = (data.assign(sum_values = data.groupby('id')['dnm'].transform(np.sum)) .query('sum_values > 300') # 只保留需要的两列 [['id', 'sum_values']] # 去除重复的id行 .drop_duplicates())
两种方法最终都会得到你期望的输出:
id sum_values 0 101122 574 1 221344 1050
内容的提问来源于stack exchange,提问作者Birish
相关产品推荐
相关产品推荐

