我有一个如下所示的数据框:
我想创建另一个名为" 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
但它给了我以下结果:
我想要的是这样的:
user_state engaged_percent
---------------------------------
California 2/21 = 0.09
Florida 2/7 = 0.28
我认为我的方法是正确的,但我不确定为什么我的结果会像第二张图片中显示的那样显示。
任何帮助将不胜感激!提前谢谢!
答案 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)
我会直接使用groupby
和apply
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