在 Pandas groupby 对象中获取比率

Getting a ratio in Pandas groupby object

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

我想为每个州创建另一个名为 "engaged_percent" 的列,它基本上是唯一 engaged_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

但它给了我以下结果:

我想要的是这样的:

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

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

如有任何帮助,我们将不胜感激!提前致谢!

我会直接使用 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

怎么样:

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