Python Pandas groupby按特定标签获取总行数的百分比
在使用Pandas时,我想计算特定列中具有正值的行的百分比,以进行不同的细分Python Pandas groupby按特定标签获取总行数的百分比,python,python-3.x,pandas,dataframe,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 | Bar
输入 一个示例可能说明了这一点,因此假设我有一个名为
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的行数
输出 我希望数据帧输出如下所示:
| Sex | Percent|
|-----|--------|
| M | 0.33 |
| F | 0.5 |
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'])
这些百分比同样是df['Sex']=
(M
或F
)和df['number']>0
尝试 在这种情况下,似乎最容易将数据子集并单独计算,我已经尝试了以下方法:
| Sex | Percent|
|-----|--------|
| M | 0.33 |
| F | 0.5 |
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'])
然而
我的real数据实际上是由多个列组成的子集,因此对每个子集执行单独的
.loc()
调用是不实际的。我想有一种方法可以用pandas的.groupby()
方法实现这一点,但是我不知道从哪里开始。最有效的方法是取组内布尔序列的平均值(groupby.mean
将使用cython)。由于我们创建的系列共享数据帧的相同索引,因此可以通过以下方式进行分组:
df['Number'].gt(0).groupby(df['Sex']).mean()
#Sex
#F 0.500000
#M 0.333333
#Name: Number, dtype: float64
最有效的方法是取组内布尔序列的平均值(
GroupBy.mean
将使用cython)。由于我们创建的系列共享数据帧的相同索引,因此可以通过以下方式进行分组:
df['Number'].gt(0).groupby(df['Sex']).mean()
#Sex
#F 0.500000
#M 0.333333
#Name: Number, dtype: float64
为什么
F
是0.5?只有一个值>0@harvpan哎呀,我更新了表格,但在我的问题中忘了更新它。。。我现在将进行更新,只是为了了解您可能想做类似df.groupby(['Number','Sex'])@Taku_u的事情。我不想按数字分组,因为这会为每个不同的数字创建单独的组。在本例中,我只想要Sex
的组。groupby的聚合将在我假设的数字列上执行。为什么F
是0.5?只有一个值>0@harvpan哎呀,我更新了表格,但在我的问题中忘了更新它。。。我现在将进行更新,只是为了了解您可能想做类似df.groupby(['Number','Sex'])@Taku_u的事情。我不想按数字分组,因为这会为每个不同的数字创建单独的组。在本例中,我只想要Sex
的组。groupby的聚合将在数字列上执行,我想如果我们在两个不同的字段上进行分组,例如“性别”和“年龄组”(想象这个字段存在),这将如何扩展?一种方法是将该列分配给DataFramedf.assign(my_col=df.Number.gt(0)).groupby(['Sex',Age Group']).my_col mean()
。但我认为这可能会不必要地复制数据帧的其余部分。因此,您可以执行上述操作,但可以提供一个系列的列表df['Number'].gt(0).groupby([df['Sex'],df['Age Group']])。mean()
这非常有效。我从来没有想过仅仅从我的条件中创建一个布尔值。谢谢!:)如果我们在两个不同的字段上分组,例如“性别”和“年龄组”(想象这个字段存在),那么这将如何扩展?一种方法是将列分配给数据帧df.assign(my_col=df.Number.gt(0)).groupby(['Sex',Age Group']).my_col mean()
。但我认为这可能会不必要地复制数据帧的其余部分。因此,您可以执行上述操作,但可以提供一个系列的列表df['Number'].gt(0).groupby([df['Sex'],df['Age Group']])。mean()
这非常有效。我从来没有想过仅仅从我的条件中创建一个布尔值。谢谢!:)