2017-08-16 33 views
2

TOTAL_FLOOR_AREAの値が> 30のローの数を数えようとしているpandas.core.groupby.DataFrameGroupByオブジェクトがあります。私が使用してGROUPBYオブジェクト内の各データフレームの行数を数えることができます。pandas 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