2017-08-16 42 views
2

我有一个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

我想你需要:

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 
0

你也可以建立一个新的列表示在条件满足,总结起来像(偷@ jezrael的数据帧):

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

请注意,True值被解释为1.因此,总和在此提供相应的计数。 在@ jezrael的解决方案的好处是,你仍然可以总结出每组

+0

没有偷,但借贷的总面积) – jezrael

+0

,我不知道该怎么还给你;) – Quickbeam2k1

+0

雅,它是区别,很高兴知道:D – jezrael