Pandas分组DataFrame后对各组单独使用apply及三类分组需求问询
嘿,我来帮你搞定这个Pandas分组的问题!先把你的DataFrame整理成更清晰的表格:
| No | col1 | col2 |
|---|---|---|
| 1 | A | 5.0 |
| 1 | B1 | 10.0 |
| 1 | B2 | 20.0 |
| 2 | A | 0.0 |
| 2 | B1 | 0.0 |
| 2 | C1 | 0.0 |
| 3 | A | 0.0 |
| 3 | B1 | 5.0 |
| 3 | C1 | 20.0 |
| 3 | C2 | 30.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
相关产品推荐
相关产品推荐

