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

Pandas分组DataFrame后对各组单独使用apply及三类分组需求问询

嘿,我来帮你搞定这个Pandas分组的问题!先把你的DataFrame整理成更清晰的表格:

Nocol1col2
1A5.0
1B110.0
1B220.0
2A0.0
2B10.0
2C10.0
3A0.0
3B15.0
3C120.0
3C230.0

看你提到要完成三项操作,第一个需求已经明确,我猜另外两个大概率是常见的互补或统计类需求,就先按这类场景给你写解决方案,要是和你的实际需求不符,随时告诉我调整就行!

具体解决方案

1. 获取全组所有行col2均为0.0的No值列表

我们可以通过groupby分组后,用all()判断每组的col2是否全部等于0.0,再筛选出符合条件的No:

import pandas as pd

# 先构造你的DataFrame(如果已经有了可以跳过这步)
df = pd.DataFrame({
    'No': [1,1,1,2,2,2,3,3,3,3],
    'col1': ['A','B1','B2','A','B1','C1','A','B1','C1','C2'],
    'col2': [5.0,10.0,20.0,0.0,0.0,0.0,0.0,5.0,20.0,30.0]
})

# 方法一:分步处理,逻辑更清晰
grouped_check = df.groupby('No')['col2'].apply(lambda x: (x == 0.0).all()).reset_index()
all_zero_nos = grouped_check[grouped_check['col2']]['No'].tolist()

# 方法二:更简洁的链式写法
all_zero_nos = df.groupby('No').filter(lambda x: (x['col2'] == 0.0).all())['No'].unique().tolist()

print(all_zero_nos)  # 输出结果:[2]

2. 获取全组至少有一行col2不为0.0的No值列表

这是第一个需求的补集,用any()判断每组是否存在非0值即可:

# 分步写法
grouped_non_zero = df.groupby('No')['col2'].apply(lambda x: (x != 0.0).any()).reset_index()
non_zero_nos = grouped_non_zero[grouped_non_zero['col2']]['No'].tolist()

# 简洁写法
non_zero_nos = df.groupby('No').filter(lambda x: (x['col2'] != 0.0).any())['No'].unique().tolist()

print(non_zero_nos)  # 输出结果:[1, 3]

3. 获取全组col2总和大于指定阈值的No值列表

如果你的第三个需求是统计类的,比如找col2总和超过25的No,代码如下(阈值可以根据你的需求自由调整):

threshold = 25  # 自定义阈值
sum_check = df.groupby('No')['col2'].sum().reset_index()
sum_gt_threshold_nos = sum_check[sum_check['col2'] > threshold]['No'].tolist()

print(sum_gt_threshold_nos)  # 输出结果:[1, 3]

内容的提问来源于stack exchange,提问作者MaMo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:59:45