在 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
我认为我的方法是正确的,但是我不确定为什么我的结果会像第二张图片中看到的那样。
如有任何帮助,我们将不胜感激!提前致谢!
我会直接使用 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
怎么样:
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
我有一个如下所示的数据框:
我想为每个州创建另一个名为 "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
我认为我的方法是正确的,但是我不确定为什么我的结果会像第二张图片中看到的那样。
如有任何帮助,我们将不胜感激!提前致谢!
我会直接使用 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
怎么样:
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