Skip to main content
 首页 » 编程设计

python之Pandas groupby 按特定标签获取总行的百分比

2025年05月04日17think

使用 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