Pandas groupby可以按特定标签获取总行数的百分比

时间:2019-09-13 18:05:52

标签: python python-3.x pandas dataframe

与Pandas合作,我想计算出在特定列中具有正值以进行细分的行的百分比。


输入

一个例子很可能说明了这一点,所以假设我有一个名为table的表,如下所示:

| ID | Name    | Sex | Number |
|----|---------|-----|--------|
| 1  | Jim     | M   | -1     |
| 2  | Carly   | F   | 1      |
| 3  | Joe     | M   | 0      |
| 4  | Barbara | F   | -1     |
| 5  | Susan   | F   | -2     |
| 6  | Phyllis | F   | 2      |
| 7  | John    | M   | 3      |

我想尽可能以最有效的方式,为每种性别(男或女)计算Number列大于0的行数。


输出

我希望获得如下所示的DataFrame输出:

| Sex | Percent|
|-----|--------|
| M   | 0.33   |
| F   | 0.5    |

这些百分比还是df['Sex']=MF AND df['Number'] > 0

的行数

尝试

在这种情况下,似乎最简单的方法是对数据进行子集化并分别进行计算,对此我尝试了以下方法:

male_df = df.loc[df['Sex']=='M']]
female_df = df.loc[df['Sex']=='F']]
d = {'M': None, 'F': None}
for sex_df, label in [(male_df, 'M'), (female_df, 'F')]:
    d[label] = len(d.loc[d['Number'] > 0])/len(d)
new_df = pd.DataFrame.from_dict(d, columns=['Sex','Percent'])

如何

我的真实数据实际上是由多列组成的子集,因此对每个子集进行单独的.loc()调用是不切实际的。我在想会有一种方法可以用熊猫的.groupby()方法来实现,但是不知道从哪里开始。

1 个答案:

答案 0 :(得分:5)

最有效的方法是对组中的布尔序列取平均值(submit_button.submit() 将使用cython)。由于我们创建的Series共享与DataFrame相同的索引,因此您可以通过以下方式进行分组:

GroupBy.mean