GroupBy基于特定列的聚合计数

时间:2018-06-18 09:54:13

标签: python pandas

我一直在寻找几个小时,似乎找不到与这个问题相关的主题。

所以基本上,我想申请一个小组来找到别的东西而不是平均值。我的groupby返回两列'feature_name'和'target_name',我想用'else_name'替换'target_name'中的值:出现次数为1,为0,两者之间的差异等。

print(df[[feature_name, target_name]])

当我使用我使用的列打印数据框时,我得到以下内容:screenshot

我已经有以下代码来计算'feature_name'的每个值的'target_name'的平均值:

df[[feature_name, target_name]].groupby([feature_name],as_index=False).mean()

返回:this

我想要计算与平均值不同的东西。以下是我想在最后计算的值:what I want

在我的情况下,功能'target_name'将始终等于1或0(1为'good'且0'为''。

我在an answer.中看到了这个例子:

df.groupby(['catA', 'catB'])['scores'].apply(lambda x: x[x.str.contains('RET')].count())

但我不知道如何将此应用于我的情况,因为x只是一个int。 在解决了这个问题之后,我仍然需要计算的不仅仅是计数!

感谢您阅读☺

1 个答案:

答案 0 :(得分:0)

import pandas as pd
import numpy as np

def my_func(x):
    # Create your 3 metrics here
    calc1 = x.min()
    calc2 = x.max()
    calc3 = x.sum()

    # return a pandas series 
    return pd.Series(dict(metric1=calc1, metric2=calc2, metric3=calc3))


# Apply the function you created
df.groupby(...)['columns needed to calculate formulas'].apply(my_func).unstack()

或者,最后使用.unstack()可以将所有3个指标视为列标题

举个例子:

df
Out[]:
   Names         A         B
0     In  0.820747  0.370199
1    Out  0.162521  0.921443
2     In  0.534743  0.240836
3    Out  0.910891  0.096016
4     In  0.825876  0.833074
5    Out  0.546043  0.551751
6     In  0.305500  0.091768
7    Out  0.131028  0.043438
8     In  0.656116  0.562967
9    Out  0.351492  0.688008
10    In  0.410132  0.443524
11   Out  0.216372  0.057402
12    In  0.406622  0.754607
13   Out  0.272031  0.721558
14    In  0.162517  0.408080
15   Out  0.006613  0.616339
16    In  0.313313  0.808897
17   Out  0.545608  0.445589
18    In  0.353636  0.465455
19   Out  0.737072  0.306329

df.groupby('Names')['A'].apply(my_func).unstack()
Out[]:
        metric1   metric2   metric3
Names                              
In     0.162517  0.825876  4.789202
Out    0.006613  0.910891  3.879669