我有一个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的行?
萨姆
答案 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
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的解决方案相比,优势在于您仍可以总计每组的总面积