通过对象在Pandas组中获得比率

时间:2017-02-19 01:51:53

标签: python pandas

我有一个如下所示的数据框:

enter image description here

我想创建另一个名为" engaged_percent"的列。对于每个状态,基本上是唯一的engage_count的数量除以每个特定状态的user_count。

我尝试了以下操作:

def f(x):
    engaged_percent = x['engaged_count'].nunique()/x['user_count']
    return pd.Series({'engaged_percent': engaged_percent})

by = df3.groupby(['user_state']).apply(f)
by

但它给了我以下结果:

enter image description here

我想要的是这样的:

user_state        engaged_percent
---------------------------------
California           2/21 = 0.09
Florida              2/7 =  0.28

我认为我的方法是正确的,但我不确定为什么我的结果会像第二张图片中显示的那样显示。

任何帮助将不胜感激!提前谢谢!

2 个答案:

答案 0 :(得分:3)

怎么样:

user_count=df3.groupby('user_state')['user_count'].mean()
#(or however you think a value for each state should be calculated)

engaged_unique=df3.groupby('user_state')['engaged_count'].nunique()

engaged_pct=engaged_unique/user_count

(你也可以用一堆不同的方式在一行中完成这个)

您的原始解决方案几乎没有问题,只是您将值除以整个user count系列。所以你得到的是系列而不是价值。您可以尝试这种轻微的变化:

def f(x):
    engaged_percent = x['engaged_count'].nunique()/x['user_count'].mean()
    return engaged_percent

by = df3.groupby(['user_state']).apply(f)
by

答案 1 :(得分:1)

我会直接使用groupbyapply

df3['engaged_percent'] = df3.groupby('user_state')
                            .apply(lambda s: s.engaged_count.nunique()/s.user_count).values

<强>演示

>>> df3
    engaged_count  user_count  user_state
0               3          21  California
1               3          21  California
2               3          21  California
...
19              4           7     Florida
20              4           7     Florida
21              4           7     Florida

>>> df3['engaged_percent'] = df3.groupby('user_state').apply(lambda s: s.engaged_count.nunique()/s.user_count).values

>>> df3
    engaged_count  user_count  user_state  engaged_percent
0               3          21  California         0.095238
1               3          21  California         0.095238
2               3          21  California         0.095238
...
19              4           7     Florida         0.285714
20              4           7     Florida         0.285714
21              4           7     Florida         0.285714