pandas:聚合统计、数据分箱、分组可视化

1、聚合统计

1.1描述统计

df.describe(),对数据的总体特征进行描述

df.groupby('team').describe()

df.groupby('team').describe().T #列数太多,进行转置

1.2统计函数

对分组对象直接使用统计函数,分组内数据进行计算,返回df形式的数据

计算平均数

df.groupby('team').mean()

相关性系数

df.groupby('team').corr()

每组的累计最大值

df.groupby('team').cummax()

1.3聚合方法agg()

将分组后的对象给定统计方法,支持按字段分别给定不同的统计方法

所有列使用一个计算方法

df.groupby('team').agg(sum)

df.groupby('team').agg(np.size)

一个字段使用多种统计方法,不同字段使用不同表达

grouped = df.groupby("team")
grouped[['Q1','Q2']].agg([np.sum,np.mean,np.std])

不同列使用不同计算方法,且一个列用多个计算方法

df.groupby("team").agg({'Q1':['min','max'],'Q2':['sum']})

agg()可以指定新列的名字,新列的名字为Mean,Sum

grouped.Q1.agg(Mean='mean',Sum='sum')

Mean为Q1计算平均值,Sum为Q2计算和。

grouped.agg(Mean=('Q1','mean'),Sum=('Q2','sum'))

如果列名不是有效的Python变量格式 比如列名是‘1_max’

grouped.agg(**{'1_max':pd.NamedAgg(column='Q1',aggfunc='max')})

使用函数,分别传入每个分组的子df,按子df把这组所有的列组成的序列传到函数里进行计算,返回固定值

lambda函数,所有方法都可以使用

def max_min(x):
return x.max()-x.min()

df.groupby('team').Q1.agg(Mean='mean',
Sum='sum',
Diff=lambda x: x.max()-x.min(),
Max_min=max_min)

1.4时序重采样resample()

针对时间序列数据,resample()将分组后的时间索引按周期进行聚合统计

创建一组数据:

idx = pd.date_range('5/21/2022',periods=100,freq='T')
df2 = pd.DataFrame(data={'a':[0,1]*50,'b':1},index=idx)
df2

索引为一个时序数据,按a列进行分组,按每20min对b进行求和

df2.groupby('a').resample('20T').sum()

df2.groupby('a').sum()

以右边时间点为标识

df2.groupby('a').resample('3T',closed='right').sum()

按月份为周期采样

df2.groupby('a').resample('M').sum()

1.5组内头尾值

所有组的第一个值

df.groupby('team').first()

最后一个值

grouped.last()

1.6组内分位数

二分位数

grouped.quantile(0.5)
grouped.median()

1.7组内差值

grouped[['Q1','Q2','Q3','Q4']].diff().head(10)

2、数据分箱

数据分箱将原始数据分成几个小区间,即bin(小箱子)

落入给定区间的原始数据值 被 代表该区间的值 替换
可以有助于减少过拟合,平滑输入数据
pd.cut :指定分界点 pd.qcut :指定区间数量,等宽分箱处理

2.1定界分箱

pd.cut指定区间,将数字进行划分

将Q1成绩按0,60,100

pd.cut(df.Q1,bins=[0,60,100])

'''
0 (60, 100] 1 (0, 60] 2 (0, 60] 3 (60, 100] 4 (60, 100] ... 95 (0, 60] 96 (0, 60] 97 (60, 100] 98 (0, 60] 99 (0, 60] Name: Q1, Length: 100, dtype: category Categories (2, interval[int64]): [(0, 60] < (60, 100]]
'''

将分箱结果应用到groupby分组

df.Q1.groupby(pd.cut(df.Q1,bins=[0,60,100])).count()

'''
Q1 (0, 60] 57 (60, 100] 43 Name: Q1, dtype: int64
'''

DateFrame使用

df.groupby(pd.cut(df.Q1,bins=[0,60,100])).count()

显示了每个分组的数据

pd.cut(df.Q1,bins=[0,60,100],labels=['不及格','及格'])

pd.cut(df.Q1,bins=[0,60,100],labels=['不及格','及格']).count()

'''
0 及格 1 不及格 2 不及格 3 及格 4 及格 ... 95 不及格 96 不及格 97 及格 98 不及格 99 不及格 Name: Q1, Length: 100, dtype: category Categories (2, object): ['不及格' < '及格']
'''

2.2等宽分箱

按Q1成绩分为两组

pd.qcut(df.Q1,q=2)

'''
0 (51.5, 98.0] 1 (0.999, 51.5] 2 (51.5, 98.0] 3 (51.5, 98.0] 4 (51.5, 98.0] ... 95 (0.999, 51.5] 96 (0.999, 51.5] 97 (51.5, 98.0] 98 (0.999, 51.5] 99 (0.999, 51.5] Name: Q1, Length: 100, dtype: category Categories (2, interval[float64]): [(0.999, 51.5] < (51.5, 98.0]]
'''

查看分组区间

pd.qcut(df.Q1,q=2).unique()

'''
[(51.5, 98.0], (0.999, 51.5]] Categories (2, interval[float64]): [(0.999, 51.5] < (51.5, 98.0]]
'''

应用到分组中:

series使用

df.Q1.groupby(pd.qcut(df.Q1,q=2)).count()

'''
Q1 (0.999, 51.5] 50 (51.5, 98.0] 50 Name: Q1, dtype: int64
'''

DateFrame使用

df.groupby(pd.qcut(df.Q1,q=2)).count()

指定标签名

pd.qcut(range(5),3,labels=['good','medium','bad'])

'''
['good', 'good', 'medium', 'bad', 'bad'] Categories (3, object): ['good' < 'medium' < 'bad']
'''

返回箱子标签

pd.qcut(df.Q1,q=2,retbins=True)

3、分组可视化

3.1绘图方法

分组,设置索引为name

grouped = df.set_index('name').groupby('team')
grouped.plot()

3.2直方图hist()

绘制直方图

grouped.hist()

3.3箱线图boxplot()

分组箱线图

grouped.boxplot(figsize=(15,12))

分组箱线图,按team分组并返回箱线图

df.boxplot(by='team',figsize=(15,10))

posted @ 2022-05-21 17:45  朝南烟  阅读(2047)  评论(0)    收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }