如何按双条件聚合Pandas DataFrame:分组后仅对col2含0和1的组计算col3均值
解决Pandas按双条件聚合的问题
我来帮你搞定这个分组聚合的需求!先看看你原来代码的问题:df.groupby(['col1'])['col2'].isin([0 & 1]).col3.mean() 这里有两个逻辑错误:一是0 & 1是按位与运算,结果是0,所以你其实只在检查col2是否等于0;二是isin的用法不对,而且你没有先筛选出同时包含0和1的col1分组,直接就去计算均值了,自然得不到想要的结果。
咱们一步步来实现你的需求:
步骤1:筛选出符合条件的col1分组
首先,我们需要找出所有col1分组中,col2同时包含0和1的组。可以用groupby结合agg来判断每个分组的col2是否同时有这两个值:
import pandas as pd # 你的示例DataFrame df = pd.DataFrame({ 'col1' : ['a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'], 'col2' : [ 0, 0, 1, 0, 1, 1, 1, 0, 1, 0], 'col3' : [ 3, 4, 2, 4, 1, 2, 3, 5, 2, 1] }) # 找出col2同时包含0和1的col1分组 valid_groups = df.groupby('col1')['col2'].agg(lambda x: {0, 1}.issubset(x.unique())) # 提取符合条件的col1值 valid_col1 = valid_groups[valid_groups].index
这里{0,1}.issubset(x.unique())会检查当前分组的col2唯一值是否同时包含0和1,返回布尔值。运行后valid_col1会是['b', 'd'],正是我们需要的分组。
步骤2:对符合条件的行进行聚合
接下来,我们从原DataFrame中筛选出这些col1的行,然后按col1和col2分组,计算col3的均值:
# 筛选有效分组的行,再按col1+col2分组计算均值 result = df[df['col1'].isin(valid_col1)].groupby(['col1', 'col2'])['col3'].mean().reset_index() # 重命名列名匹配你的期望输出 result.columns = ['col1', 'col2', 'mean(col3)']
查看结果
运行以上代码后,result的输出就是你想要的:
| col1 | col2 | mean(col3) |
|---|---|---|
| b | 0 | 4.0 |
| b | 1 | 2.0 |
| d | 0 | 3.0 |
| d | 1 | 2.0 |
这样就完美实现了你的需求:只保留那些col1分组中col2同时有0和1的组,然后计算每个组内col2对应col3的均值。
内容的提问来源于stack exchange,提问作者Geveze
相关产品推荐
相关产品推荐

