[Python]将已有DataFrame分组聚合后(group by)的统计信息(describe())导入到新的 DataFrame

描述

在数理统计中,百分位对数据有很好的描述性,并且也能帮助判断数据的异常值的状态。

本文以时间维度来切入讲解如何使用python拉取dataframe分组聚合后统计信息

事例(前提介绍)

小明在日常生活中想要寻找出,快递送达的时间是否会因为不可避免的因素而增加,比如这次全球性的疫情。因此,她决定通过观察近一年来每日快递送达时间各百分位下的变化状态,从而通过线性图初步观察快递送达的时间是否会因为全球性的疫情受到影响

但是面多海量的数据小明遇到了难题:如何将数据在聚合到每日的情况下找出每日各百分位的值?

解决方案

小明遇到的问题在python 中很好解决。

利用到Python的函数

将数据在聚合到每日的情况下找出每日各百分位的值用到的主要函数

  1. groupby():用于对数据进行一至多列聚合
  2. describe():统计一个series中的信息:
    a. Count
    b.mean
    c.min # 最小即 0百分位的数
    d.25% # 25百分位的数
    e.50% # 50百分位的数
    f.75% # 75百分位的数
    g.max # 最大即 100百分位的数
    h.std

演示

本文所用包的导入

import pyodbc
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

原始数据如下图所示
在这里插入图片描述

首先,将快递寄出时间点通过pandas自带的to_datetime函数转化成时间类型

send_raw_cr['寄出时间']=pd.to_datetime(send_raw_cr['寄出时间'])

第二步,将快递的配送时长根据寄出时间进行聚类的同时,利用describe()统计每个serie的信息

send_cr = send_raw_cr.set_index([send_raw_cr.groupby(send_raw_cr['寄出时间']).cumcount(),'寄出时间'])['配送时长'].unstack().describe().T

第二步中用到的函数解释:

  1. set_index:将普通列设置成索引列
  2. cumcount():各组组内取出索引,然后索引进行排序
  3. unstack():将列索引转变成行索引,简单点理解即列转行
  4. describe().T:行列转置
    a.describe()输出为下图状态
    在这里插入图片描述
    b. describe().T输出为下图:
    在这里插入图片描述

第三步,根据的得出的新的dataframe制图。

第二步得出的最终 dataframe
在这里插入图片描述
制图

plt.figure(figsize=(30,20)) #确定图表大小
plt.plot(send_cr['min'],label = 'min')
plt.plot(send_cr['25%'],label = '25%')
plt.plot(send_cr['50%'],label = '50%')
plt.plot(send_cr['75%'],label = '75%')
plt.plot(send_cr['max'],label = 'max')
plt.title('send_cr(25%,50%,75%)') #设置title
plt.legend() #展示label
plt.savefig('send_cr(25%,50%,75%)') #保存图片
plt.show() #展示图片

现在小明可以根据展示出来的图表来进行初步分析是否全球疫情期间快递的配送时间会较长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AutismThyself

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值