You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:30:07