在数据分析中,经常会用到分组,可用函数 pandas 中的groupby()。
groupby()主要的分组统计方向:
1、分组汇总
2、分组描述性统计分析
3、分组计算均值等统计量
4、分组去重
5、分组排序取样本
6、分组汇总,然后再分组计算
Date Latitude Longitude Depth Type
01/02/1965 19.246 145.616 131.6 Earthquake
01/04/1965 1.863 127.352 80.0 Earthquake
01/05/1965 -20.579 -173.972 20.0 Earthquake
01/08/1965 -59.076 -23.557 15.0 Earthquake
01/09/1965 11.938 126.427 15.0 Earthquake
#1、分组统计组内个数
df.groupby(['date','Type'])
.size()
#2、分组统计计算‘Depth’的基本数据分布
df.groupby(['date','type'])['Depth']
.describe()
#3、分组统计计算‘Latitude’的均值
df.groupby(['date','type'])
.agg({'Latitude':'mean'})
#分组统计计算两列数据的均值
df.groupby(['date','type'])
.agg(la_mean = ('Latitude','mean'),
lo_mean = ('Longitude','mean'),
la_range = ('depth',lambda x:x.max() - x.min()))
#4、分组然后对每组去重,然后汇总去重后的个数
df.groupby('date')
.apply(lambda x: x.drop_duplicates('Type')['Type']
.count())
#5、分组,然后按照‘Latitude’降序,并取出每组的前3个样本。
df.groupby(['date'])
.apply(lambda x: x.sort_values('Latitude',ascending = False)
.head(3))
#6、分组,然后汇总计算两列数据,再进行分组,取出每一组‘la_sum'的最大值
df.groupby(['date','type'])
.agg(la_sum = ('Latitude','sum'),
lo_sum = ('Longitude','sum'))
.groupby(['date'])
.apply(lambda x:x.sort_values('la_sum ',ascending = False).head(1))
#分组,然后按照type排序,再分组,取出前10汇总和后10汇总,然后再计算两者的比率
df.groupby('date')
.apply(lambda x:x.sort_values('type'))
.reset_index(drop = True).groupby('date')
.agg(tail10 = ('depth',lambda x:x.head(10).sum()),
top10 = ('depth',lambda x:x.tail(10).sum()))
.apply(lambda x:x['top10']/x['tail10'],axis = 1)
groupby()结合agg()和apply(),可以解决很多复杂的分组计算问题。