2017-08-16 16 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