Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.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 通过获取组内满足条件的值的百分比_Python_Python 2.7_Pandas - Fatal编程技术网

Python 通过获取组内满足条件的值的百分比

Python 通过获取组内满足条件的值的百分比,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个由人、天和类型组成的数据框架。这些数据没有真正意义,只是一个例子 我想先对人进行分组,然后键入类型,然后找出小于或等于3天的天数百分比 为此,我创建了一个Boolean列,时间等于或小于3天。然后应用count和sum聚合。我不太喜欢这种方法,因为我只需要天数列的计数,以及天数限制列的总和。这个方法实质上是创建两个不必要的列,并创建一些额外的步骤。如何清理此代码,使其在更大的数据集上更高效地运行 import pandas as pd # create dataframe df = pd

我有一个由
类型
组成的数据框架。这些数据没有真正意义,只是一个例子

我想先对
进行分组,然后键入
类型
,然后找出小于或等于3天的天数百分比

为此,我创建了一个
Boolean
列,时间等于或小于3天。然后应用
count
sum
聚合。我不太喜欢这种方法,因为我只需要
天数
列的
计数
,以及
天数限制
列的
总和
。这个方法实质上是创建两个不必要的列,并创建一些额外的步骤。如何清理此代码,使其在更大的数据集上更高效地运行

import pandas as pd
# create dataframe
df = pd.DataFrame(data=[['A', 4, 'Type 1'],
                        ['A', 1, 'Type 1'],
                        ['A', 3, 'Type 2'],
                        ['A', 0, 'Type 1'],
                        ['A', 12, 'Type 2'],
                        ['B', 1, 'Type 1'],
                        ['B', 3, 'Type 1'],
                        ['B', 5, 'Type 2']],
                   columns=['Person', 'Days', 'Type'])

df['Under Day Limit'] = df['Days'] <= 3;
print df
df = df.groupby(['Person', 'Type']).agg(['count', 'sum'])

df['Percent under Day Limit'] = df['Under Day Limit']['sum'] / df['Days']['count']
print df
  • 人员
    类型上设置索引
  • 天数的布尔数列
    >=3
  • groupby
    索引中的级别
  • value\u计数(normalize=True)


格式稍微多一点

               Days     Under Day Limit     Percent under Day Limit
              count sum           count sum                        
Person Type                                                        
A      Type 1     3   5               3   2                0.666667
       Type 2     2  15               2   1                0.500000
B      Type 1     2   4               2   2                1.000000
       Type 2     1   5               1   0                0.000000
df.set_index(['Person', 'Type']).Days.ge(3).groupby(level=[0, 1]).value_counts(True)

Person  Type    Days 
A       Type 1  False    0.666667
                True     0.333333
        Type 2  True     1.000000
B       Type 1  False    0.500000
                True     0.500000
        Type 2  True     1.000000
Name: Days, dtype: float64
df.set_index(['Person', 'Type']).Days.rename('>= 3').ge(3)  \
  .groupby(level=[0, 1]).value_counts(True).unstack(fill_value=0)