我想详细阐述一下分组逻辑如下。给定数据框 df
:
df =
ID GROUP DAY GRADE TIME_1
1 AAA 1 5 20
1 AAA 1 4 19
1 AAA 1 3 21
1 BBB 2 1 10
2 BBB 2 3 13
我需要按ID
、GRADE
、GROUP
和DAY
对行进行分组,并计算平均值TIME_1
,一组中的行数。另外(这是我的问题),我想检查 GRADE
是 4 还是 5,那么它应该被分组为正成绩并且平均 TIME_1
应该根据它,否则 - 为负数。
结果应该是这样的:
result =
GROUP DAY AVG_TIME_1_POSITIVE AVG_TIME_1_NEGATIVE QTY_POSITIVE QTY_NEGATIVE
AAA 1 19.5 21 2 1
BBB 2 0 11.5 0 2
我用的是这种方式,但是不知道如何通过GRADE
指定分组条件:
result = df.groupby(['GROUP','GRADE','DAY']).agg({'TIME_1': 'mean',
'ID': 'count'}).reset_index()
最佳答案
一个可能的解决方案是 boolean indexing
然后使用 concat
:
mask = df.GRADE.isin([4,5])
result1 = df[mask].groupby(['GROUP','DAY']).agg({'TIME_1': 'mean',
'ID': 'count'}).add_suffix('_POSITIVE')
print (result1)
TIME_1_POSITIVE ID_POSITIVE
GROUP DAY
AAA 1 19.5 2
result2 = df[~mask].groupby(['GROUP','DAY']).agg({'TIME_1': 'mean',
'ID': 'count'}).add_suffix('_NEGATIVE')
print (result2)
TIME_1_NEGATIVE ID_NEGATIVE
GROUP DAY
AAA 1 21.0 1
BBB 2 11.5 2
print (pd.concat([result1, result2], axis=1))
TIME_1_POSITIVE ID_POSITIVE TIME_1_NEGATIVE ID_NEGATIVE
GROUP DAY
AAA 1 19.5 2.0 21.0 1
BBB 2 NaN NaN 11.5 2
关于python - 具有均值和计数的条件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41484231/