我一直在寻找几个小时,似乎找不到与这个问题相关的主题。
所以基本上,我想申请一个小组来找到别的东西而不是平均值。我的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。 在解决了这个问题之后,我仍然需要计算的不仅仅是计数!
感谢您阅读☺
答案 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