使用 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 |
我想以最有效的方式,为每种性别(M 或 F)计算 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() 是不切实际的。我在想有一种方法可以用 pandas 的 .groupby() 方法来实现,但是不知道从哪里开始。
请您参考如下方法:
最有效的方法是在组内取 bool 级数的平均值(GroupBy.mean 将使用 cython)。由于我们创建的 Series 共享 DataFrame 的相同索引,因此您可以这样分组:
df['Number'].gt(0).groupby(df['Sex']).mean()
#Sex
#F 0.500000
#M 0.333333
#Name: Number, dtype: float64
