与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']=
(M
或F
) 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()
方法来实现,但是不知道从哪里开始。
答案 0 :(得分:5)
最有效的方法是对组中的布尔序列取平均值(submit_button.submit()
将使用cython)。由于我们创建的Series共享与DataFrame相同的索引,因此您可以通过以下方式进行分组:
GroupBy.mean