ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-21 18:02:59  阅读:200  来源: 互联网

标签:Q1 分箱 df groupby 60 可视化 pd 51.5 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))

标签:Q1,分箱,df,groupby,60,可视化,pd,51.5,pandas
来源: https://www.cnblogs.com/caolanying/p/16295609.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有