Python: 如何使用 groupby().size() 的结果

Python: how to use result of groupby().size()

我有一个 Kickstarter 数据集,想在图中显示成功率。所以有一个列“成功”,它是“是”或“否”以及不同的国家。

Succesfull=df[['country', 'succesfull']].groupby(['country', 'succesfull']).size()

我用这条线创建了一个新的数据框,它显示了一个国家有多少项目是成功的,有多少没有。看起来像这样:

我现在如何计算每个国家/地区的成功率(“是”的数量/总数量)?我怎样才能访问没有名称的最后一列(只有一个 0)。

这可能不是最好的方法,但我就是这样分解问题的。

1) 制作一个可重现的小例子来测试不同的情况[​​=33=]
df = pd.DataFrame({'country': ['AU', 'AU', 'CA', 'CA', 'GB', 'GB'], 'successfull': ['Yes', 'No', 'No', 'No', 'Yes', 'Yes']})

df
Out[3]: 
  country successfull
0      AU         Yes
1      AU          No
2      CA          No
3      CA          No
4      GB         Yes
5      GB         Yes

2) 计算成功的项目

只匹配 'Yes' 的值并计算它们

success = df[df['successfull'] == 'Yes'].groupby('country').size()

success
Out[5]: 
country
AU    1
GB    2
dtype: int64

3) 计算项目总数

与发布的问题类似。

total = df.groupby('country').size()

total
Out[7]: 
country
AU    2
CA    2
GB    2
dtype: int64

4) 取成功项目占项目总数的比例

一旦这两个系列存在,就可以计算比率。如果一个国家没有 'Yes',它将变成 NaN。把这些换成0,因为这里成功率为0

Successfull = (success/total).replace(np.nan, 0)
Out[10]: 
country
AU    0.5
CA    0.0
GB    1.0
dtype: float64

5) 访问数据

上面的成功对象是一个Pandas.Series。下面是一些访问示例。比如要知道一个国家有多成功,就用国家代码作为索引:

Successfull['AU']
Out[11]: 0.5

要获得一组成功率,可以访问 .values 属性。

Successfull.values
Out[12]: array([0.5, 0. , 1. ])

绘制结果

Successfull.plot()