如何用Pandas按name分组求和并筛选出现次数超1的记录
解决思路与代码实现
原代码报错原因
你写的代码报错是因为df.groupby(['name']).count()返回的是以name为索引的统计结果,和原df的索引(0-5)不匹配,直接用它做布尔索引会导致对齐失败,无法正确筛选数据。
可行解决方案
这里提供几种简洁的实现方式,都能满足你的需求:
方法1:先筛选有效name再求和
import pandas as pd df = pd.DataFrame({ 'name':["aa","aa","aa","bb","cc","cc"], 'value':[1,2,3,4,5,6]}) # 1. 统计每个name的出现次数 name_counts = df['name'].value_counts() # 2. 提取出现次数>1的name valid_names = name_counts[name_counts > 1].index # 3. 过滤原数据并分组求和,重置索引得到目标结构 result = df[df['name'].isin(valid_names)].groupby('name')['value'].sum().reset_index(name='total') print(result)
方法2:用groupby的filter方法一步筛选
result = df.groupby('name').filter(lambda x: len(x) > 1).groupby('name')['value'].sum().reset_index(name='total')
filter方法会直接保留分组后长度>1的组,后续再求和即可。
方法3:先聚合再过滤
# 同时计算求和结果和出现次数 grouped_data = df.groupby('name').agg( total=('value', 'sum'), name_count=('name', 'count') ) # 过滤次数>1的项,删除多余列并重置索引 result = grouped_data[grouped_data['name_count'] > 1].drop('name_count', axis=1).reset_index()
输出结果
无论用哪种方法,最终输出的DataFrame都是:
name total 0 aa 6 1 cc 11
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

