Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas groupby按特定标签获取总行数的百分比_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

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

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

在使用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的行数


输出 我希望数据帧输出如下所示:

| 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的聚合将在数字列上执行,我想如果我们在两个不同的字段上进行分组,例如“性别”和“年龄组”(想象这个字段存在),这将如何扩展?一种方法是将该列分配给DataFrame
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()
这非常有效。我从来没有想过仅仅从我的条件中创建一个布尔值。谢谢!:)如果我们在两个不同的字段上分组,例如“性别”和“年龄组”(想象这个字段存在),那么这将如何扩展?一种方法是将列分配给数据帧
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()
这非常有效。我从来没有想过仅仅从我的条件中创建一个布尔值。谢谢!:)