有条件地计算pandas groupby对象中的值

时间:2017-08-16 13:18:37

标签: python pandas dataframe

我有一个pandas.core.groupby.DataFrameGroupBy对象,我试图计算TOTAL_FLOOR_AREA的值为> 30的行数。我可以使用以下方法计算groupby对象中每个数据帧的行数:

import numpy as np

grouped = master_lsoa.groupby('lsoa11')

grouped.aggregate(np.count_nonzero).TOTAL_FLOOR_AREA

但是,如何有条件地计算TOTAL_FLOOR_AREA的值大于30的行?

萨姆

2 个答案:

答案 0 :(得分:2)

我认为你需要:

np.random.seed(6)

N = 15
master_lso = pd.DataFrame({'lsoa11': np.random.randint(4, size=N),
                           'TOTAL_FLOOR_AREA': np.random.choice([0,30,40,50], size=N)})
master_lso['lsoa11'] = 'a' + master_lso['lsoa11'].astype(str)
print (master_lso)
    TOTAL_FLOOR_AREA lsoa11
0                 40     a2
1                 50     a1
2                 30     a3
3                  0     a0
4                 40     a2
5                  0     a1
6                 30     a3
7                  0     a2
8                 40     a0
9                  0     a2
10                 0     a1
11                50     a1
12                50     a3
13                40     a1
14                30     a1

首先按条件按boolean indexing过滤行 - 在分组前更快,因为行数较少。

df = master_lso[master_lso['TOTAL_FLOOR_AREA'] > 30]
print (df)
    TOTAL_FLOOR_AREA lsoa11
0                 40     a2
1                 50     a1
4                 40     a2
8                 40     a0
11                50     a1
12                50     a3
13                40     a1

然后groupby并汇总size

df1 = df.groupby('lsoa11')['TOTAL_FLOOR_AREA'].size().reset_index(name='Count')
print (df1)
  lsoa11  Count
0     a0      1
1     a1      3
2     a2      2
3     a3      1

答案 1 :(得分:0)

您还可以构建一个新列,指出满足条件的位置,并总结一下(窃取@ jezrael'数据帧):

master_lso.assign(Large_Enough= lambda x:x["TOTAL_FLOOR_AREA"]>30)\
    .groupby('lsoa11')["Large_Enough"].sum().reset_index()

请注意,True值被解释为1.因此总和在此提供相应的计数。 与@ jezrael的解决方案相比,优势在于您仍可以总计每组的总面积