pandas数据处理进阶详解

一、pandas的统计分析

1、关于pandas 的数值统计(统计detail 中的 单价的相关指标)

import pandas as pd

# 加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
print("detail :\n", detail)

print("detail 的列索引名称:\n", detail.columns)
print("detail 的形状:\n", detail.shape)
print("detail 数据类型:\n", detail.dtypes)

print("amounts 的最大值:\n",detail.loc[:,'amounts'].max())
print("amounts 的最小值:\n",detail.loc[:,'amounts'].min())
print("amounts 的均值:\n",detail.loc[:,'amounts'].mean())
print("amounts 的中位数:\n",detail.loc[:,'amounts'].median())
print("amounts 的方差:\n",detail.loc[:,'amounts'].var())
print("amounts 的describe:\n",detail.loc[:,'amounts'].describe())
# 对于两列的统计结果
print("amounts 的describe:\n",detail.loc[:,['counts','amounts']].describe())
print("amounts 的describe:\n",detail.loc[:,['counts','amounts']].describe())
print("amounts 的describe:\n",detail.loc[:,'amounts'].describe())
print("amounts 的describe:\n",detail.loc[:,'counts'].describe())
print("amounts 的极差:\n",detail.loc[:,'amounts'].ptp())
print("amounts 的标准差:\n",detail.loc[:,'amounts'].std())
print("amounts 的众数:\n",detail.loc[:,'amounts'].mode()) # 返回众数的数组
print("amounts 的众数:\n",detail.loc[:,'counts'].mode()) # 返回众数的数组
print("amounts 的非空值的数目:\n",detail.loc[:,'amounts'].count())
print("amounts 的最大值的位置:\n",detail.loc[:,'amounts'].idxmax()) # np.argmax()
print("amounts 的最小值的位置:\n",detail.loc[:,'amounts'].idxmin()) # np.argmin()

2、pandas对于非数值型数据的统计分析

(1)对于dataframe转化数据类型,其他类型 转化为object类型

detail.loc[:,'amounts'] = detail.loc[:,'amounts'].astype('object')

(2)类别型数据

detail.loc[:,'amounts'] = detail.loc[:,'amounts'].astype('category')
print("统计类别型数据的describe指标:\n",detail.loc[:, 'amounts'].describe())

(3)统计实例

## 在detail中 哪些菜品最火?菜品卖出了多少份?
# 若白饭算菜
detail.loc[:, 'dishes_name'] = detail.loc[:, 'dishes_name'].astype('category')
print("按照dishes_name统计描述信息:\n", detail.loc[:, 'dishes_name'].describe())

# 若白饭不算菜 ---把白饭删除,再统计
# drop labels ---行的名称, axis =0,inplace = True
# 行的名称??? 怎么获取----bool值
# 定位到白饭的行
bool_id = detail.loc[:, 'dishes_name'] == '白饭/大碗'

# 进行 获取行名称
index = detail.loc[bool_id, :].index

# 进行删除
detail.drop(labels=index, axis=0, inplace=True)

# 在进行转化类型
detail.loc[:, 'dishes_name'] = detail.loc[:, 'dishes_name'].astype('category')

# 在进行统计描述信息
print("按照dishes_name统计描述信息:\n", detail.loc[:, 'dishes_name'].describe())

# 看 在detail 中那个订单点的菜最多,点了多少份菜?
# 将 order_id 转化为类别型数据 ,再 进行describe
detail.loc[:, 'order_id'] = detail.loc[:, 'order_id'].astype("category")
# 统计描述
print("按照order_id统计描述信息为:\n", detail.loc[:, 'order_id'].describe())

二、pandas时间数据

  • datetime64[ns] ---numpy 里面的时间点类
  • Timestamp ---pandas 默认的时间点类型----封装了datetime64[ns]
  • DatetimeIndex ---pandas 默认支持的时间序列结构

1、可以通过 pd.to_datetime 将时间点数据转化为pandas默认支持的时间点数据

res = pd.to_datetime("2016/01/01")
print("res:\n",res)
print("res 的类型:\n",type(res))

2、时间序列转化 --可以通过pd.to_datetime 或者pd.DatetimeIndex将时间序列转化为pandas默认支持的时间序列结构

res = pd.to_datetime(['2016-01-01', '2016-01-01', '2016-01-01', '2011-01-01'])
res1 = pd.DatetimeIndex(['2016-01-01', '2016-01-02', '2016-02-05', '2011-09-01'])
print("res:\n", res)
print("res 的类型:\n", type(res))

print("res1:\n", res1)
print("res1 的类型:\n", type(res1))

3、

import pandas as pd
# #加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
# print("detail :\n",detail)
print("detail 的列索引名称:\n", detail.columns)
print("detail 的形状:\n", detail.shape)
# print("detail 数据类型:\n",detail.dtypes)
print("*" * 80)
# 获取place_order_time列
print(detail.loc[:, 'place_order_time'])

# 转化为pandas默认支持的时间序列结构
detail.loc[:, 'place_order_time'] = pd.to_datetime(detail.loc[:, 'place_order_time'])

# print(detail.dtypes)
print("*" * 80)

# 获取该时间序列的属性---可以通过列表推导式来获取时间点的属性
year = [i.year for i in detail.loc[:, 'place_order_time']]
print("年:\n", year)

month = [i.month for i in detail.loc[:, 'place_order_time']]
print("月:\n", month)

day = [i.day for i in detail.loc[:, 'place_order_time']]
print("日:\n", day)

quarter = [i.quarter for i in detail.loc[:, 'place_order_time']]
print("季度:\n", quarter)

# 返回对象
weekday = [i.weekday for i in detail.loc[:, 'place_order_time']]
print("周几:\n", weekday)

weekday_name = [i.weekday_name for i in detail.loc[:, 'place_order_time']]
print("周几:\n", weekday_name)

is_leap_year = [i.is_leap_year for i in detail.loc[:, 'place_order_time']]
print("是否闰年:\n", is_leap_year)

4、时间加减

import pandas as pd
res = pd.to_datetime("2016-01-01")
print("res:\n", res)
print("res 的类型:\n", type(res))

print("时间推后一天:\n", res + pd.Timedelta(days=1))
print("时间推后一小时:\n", res + pd.Timedelta(hours=1))

detail.loc[:, 'place_over_time'] = detail.loc[:, 'place_order_time'] + pd.Timedelta(days=1)
print(detail)

## 时间差距计算
res = pd.to_datetime('2019-10-9') - pd.to_datetime('1996-11-07')
print(res)

5、获取本机可以使用的最初时间 和最后使用的时间节点

print(pd.Timestamp.min)
print(pd.Timestamp.max)

三、分组聚合

import pandas as pd
import numpy as np

# 加载数据
users = pd.read_excel("./users.xlsx")
print("users:\n", users)
print("users 的列索引:\n", users.columns)
print("users 的数据类型:\n", users.dtypes)

# 根据班级分组、统计学员的班级的平均年龄
# groupby 分组
# by ---指定分组的列,可以是单列 也可以是多列
# res = users.groupby(by='ORGANIZE_NAME')['age'].mean()
# 按照单列进行分组,统计多个列的指标
# res = users.groupby(by='ORGANIZE_NAME')[['age','USER_ID']].mean()
res = users.groupby(by=['ORGANIZE_NAME', 'poo', 'sex'])['age'].mean()
print(res)

# 利用agg
# 进行同时对age 求平均值、对userid 求最大值
# 只需要指定 np.方法名
print(users.agg({'age': np.mean, 'USER_ID': np.max}))

# 对age 和 USER_ID 同时分别求 和 和均值
print(users[['age', 'USER_ID']].agg([np.sum, np.mean]))

# 对age USER_ID 求取不同个数的统计指标
print(users.agg({'age': np.min, 'USER_ID': [np.mean, np.sum]}))

def hh(x):
 return x + 1

# 自定义函数进行计算
# res = users['age'].apply(hh)
# res = users[['age','USER_ID']].apply(lambda x:x+1)
res = users['age'].transform(lambda x: x + 1)
# 不能进行跨列的运算
print(res)

四、透视表与交叉表

import pandas as pd

# 加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
print("detail :\n", detail)
print("detail 的列名:\n", detail.columns)
print("detail 的数据类型:\n", detail.dtypes)

# 获取时间点的日属性
# 必须pandas默认支持的时间序列类型
detail.loc[:, 'place_order_time'] = pd.to_datetime(detail.loc[:, 'place_order_time'])

# 以列表推导式来获取日属性
detail.loc[:, 'day'] = [i.day for i in detail.loc[:, 'place_order_time']]

# 透视表 是一种plus 版的分组聚合
# 创建一个透视表
# data dataframe数据
# values 最终统计指标所针对对象,要关心的数据主体
# index --按照index 进行行分组
# columns ---按照columns进行列分组
# aggfunc ---对主体 进行什么指标的统计

# res = pd.pivot_table(data=detail[['amounts','order_id','counts','dishes_name','day']],values='amounts',columns=['day','counts'],index=['order_id','dishes_name'],aggfunc='mean',margins=True)
# # print(res)
# res.to_excel("./hh.xlsx")

# 交叉表 mini版的透视表
# 如果只传index 与columns 统计这两列的相对个数
# res = pd.crosstab(index=detail['counts'],columns=detail['amounts'])
# values 必须和aggfunc同时存在
res = pd.crosstab(index=detail['order_id'],columns=detail['counts'],values=detail['amounts'],aggfunc='mean')
print(res)

五、案例

1、营业额案例

import pandas as pd

# detail 有时间数据

# 加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
print("detail :\n", detail)
print("detail 的列名:\n", detail.columns)
print("detail 的数据类型:\n", detail.dtypes)

# 计算每个菜品的销售额 ,增加到detail
detail.loc[:, 'pay'] = detail.loc[:, 'counts'] * detail.loc[:, 'amounts']

# print(detail)

# 获取时间点的日属性
# 必须pandas默认支持的时间序列类型
detail.loc[:, 'place_order_time'] = pd.to_datetime(detail.loc[:, 'place_order_time'])

# 以列表推导式来获取日属性
detail.loc[:, 'day'] = [i.day for i in detail.loc[:, 'place_order_time']]
# print(detail)
# 以 日 为分组 ,统计pay的sum
res = detail.groupby(by='day')['pay'].sum()
print(res)
# print(type(res))

df = pd.DataFrame(res.values, columns=['monty'], index=res.index)
print(df)
print(type(df))

2、连锁超市案例

import pandas as pd

# 加载数据
order = pd.read_csv("./order.csv", encoding='ansi')
print("order:\n", order)
print("order 的列索引:\n", order.columns)

# 1、哪些类别的商品比较畅销?
# 剔除销量 < 0 的数据 (保留销量 >0 的数据)
# 保存
bool_id = order.loc[:, '销量'] > 0
data = order.loc[bool_id, :] # 剔除异常数据之后的正常数据

print(data.shape)
print("*" * 80)

# 删除异常
# bool_id = order.loc[:,'销量'] <= 0
# index = order.loc[bool_id,:].index
#
# data = order.drop(labels=index,axis=0,inplace=False)

# 按照类别进行分组,统计销量的 和
# 进行dataframe或者series的值排序
# 如果series sort_values()直接按照seies的值进行排序
# 如果df 那么需要指定 按照哪一列进行排序,by= 列名

# 默认是升序ascending=True
# ascending=False 降序
# res = data.groupby(by='类别ID')['销量'].sum().sort_values(ascending=False)
#
# print(res)

# 2、哪些商品比较畅销?
# 分组聚合实现
# res = data.groupby(by='商品ID')['销量'].sum().sort_values(ascending=False).head(10)
#
# print(res)

# 透视表实现
# res = pd.pivot_table(data=data.loc[:, ['商品ID', '销量']], index='商品ID', values='销量', aggfunc='sum').sort_values(by='销量',
#                            ascending=False).head(
#  10)
# print(res)

# 3、求不同门店的销售额占比
# 提示:订单中没有销售额字段,所有需要新增一个销售额字段。增加字段后按照门店编号进行分组,然后计算占比。

# # 先计算销售额
# data.loc[:,'销售额'] = data.loc[:,'单价'] * data.loc[:,'销量']
#
# # 按照门店编号进行分组统计销售额的sum
# res = data.groupby(by='门店编号')['销售额'].sum()
# # print(res)
# # 计算所有的销售额总和
# all_ = res.sum()
#
# # print(all_)
# per_ = res / all_
#
# print("各个门店的销售额占比为:\n",per_.apply(lambda x:format(x,".2%")))

# a = 100.105
# print("%.2f"%a)

# print("{}%".format(2.0))

# 匿名函数
# print(lambda x:x+5) #
#
# def add(x):
# #  return x+5

# 4、哪段时间段是超市的客流高峰期?
# 提示:需要知道每个时间段对应的客流量,但是订单表中既有日期又有时间,我们需要从中提出小时数,这里利用订单ID去重计数代表客流量。

# 先对订单去重
# subset 去重的那一列 的列名,可以是多列,多列的时候传列表
data.drop_duplicates(subset='订单ID', inplace=True)

# print(data.shape)

# 按照小时分组对订单ID进行统计数量

# 将成交时间转化为 pandas默认支持的时间序列类型
data.loc[:, '成交时间'] = pd.to_datetime(data.loc[:, '成交时间'])

# 获取小时属性,增加到data 中

data.loc[:, 'hour'] = [i.hour for i in data.loc[:, '成交时间']]

# print(data)

# 按照hour 分组 统计 订单ID数量

res = data.groupby(by='hour')['订单ID'].count().sort_values(ascending=False)

print(res)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • pandas 选取行和列数据的方法详解

    前言 本文介绍在 pandas 中如何读取数据行列的方法.数据由行和列组成,在数据库中,一般行被称作记录 (record),列被称作字段 (field).回顾一下我们对记录和字段的获取方式:一般情况下,字段根据名称获取,记录根据筛选条件获取.比如获取 student_id 和 studnent_name 两个字段:记录筛选,比如 sales_amount 大于 10000 的所有记录.对于熟悉 SQL 语句的人来说,就是下面的语句: select student_id, student_name

  • Python数据分析模块pandas用法详解

    本文实例讲述了Python数据分析模块pandas用法.分享给大家供大家参考,具体如下: 一 介绍 pandas(Python Data Analysis Library)是基于numpy的数据分析模块,提供了大量标准数据模型和高效操作大型数据集所需要的工具,可以说pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一. pandas主要提供了3种数据结构: 1)Series,带标签的一维数组. 2)DataFrame,带标签且大小可变的二维表格结构. 3)Panel,带标

  • 使用Pandas对数据进行筛选和排序的实现

    筛选和排序是Excel中使用频率最多的功能,通过这个功能可以很方便的对数据表中的数据使用指定的条件进行筛选和计算,以获得需要的结果.在Pandas中通过.sort和.loc函数也可以实现这两 个功能..sort函数可以实现对数据表的排序操作,.loc函数可以实现对数据表的筛选操作.本篇文章将介绍如果通过Pandas的这两个函数完成Excel中的筛选和排序操作. 首选导入需要使用的Pandas库和numpy库,读取并创建数据表,将数据表命名为lc. import pandas as pd impo

  • Pandas数据离散化原理及实例解析

    这篇文章主要介绍了Pandas数据离散化原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 为什么要离散化 连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数.离散化方法经常作为数据挖掘的工具 扔掉一些信息,可以让模型更健壮,泛化能力更强 什么是数据的离散化 连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值 分箱 案例 1.

  • 详解pandas数据合并与重塑(pd.concat篇)

    1 concat concat函数是在pandas底下的方法,可以将数据根据不同的轴作简单的融合 pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False) 参数说明 objs: series,dataframe或者是panel构成的序列lsit axis: 需要合并链接的轴,0是行,1是列

  • Python Pandas 如何shuffle(打乱)数据

    在Python里面,使用Pandas里面的DataFrame来存放数据的时候想要把数据集进行shuffle会许多的方法,本文介绍两种比较常用而且简单的方法. 应用情景: 我们有下面以个DataFrame 我们可以看到BuyInter的数值是按照0,-1,-1,2,2,2,3,3,3,3这样排列的,我们希望不保持这个次序,但是同时列属性又不能改变,即如下效果: 实现方法: 最简单的方法就是采用pandas中自带的 sample这个方法. 假设df是这个DataFrame df.sample(fra

  • Python使用Pandas对csv文件进行数据处理的方法

    今天接到一个新的任务,要对一个140多M的csv文件进行数据处理,总共有170多万行,尝试了导入本地的MySQL数据库进行查询,结果用Navicat导入直接卡死....估计是XAMPP套装里面全默认配置的MySQL性能不给力,又尝试用R搞一下吧结果发现光加载csv文件就要3分钟左右的时间,相当不给力啊,翻了翻万能的知乎发现了Python下的一个神器包:Pandas(熊猫们?),加载这个140多M的csv文件两秒钟就搞定,后面的分类汇总等操作也都是秒开,太牛逼了!记录一下这次数据处理的过程: 使用

  • pandas 对日期类型数据的处理方法详解

    pandas 的日期/时间类型有如下几种: Concept Scalar Class Array Class pandas Data Type Primary Creation Method Date times Timestamp DatetimeIndex datetime64[ns] or datetime64[ns, tz] to_datetime or date_range Time deltas Timedelta TimedeltaIndex timedelta64[ns] to_

  • pandas数据处理进阶详解

    一.pandas的统计分析 1.关于pandas 的数值统计(统计detail 中的 单价的相关指标) import pandas as pd # 加载数据 detail = pd.read_excel("./meal_order_detail.xlsx") print("detail :\n", detail) print("detail 的列索引名称:\n", detail.columns) print("detail 的形状:\n

  • Pandas 数据处理,数据清洗详解

    如下所示: # -*-coding:utf-8-*- from pandas import DataFrame import pandas as pd import numpy as np """ 获取行列数据 """ df = DataFrame(np.random.rand(4, 5), columns=['A', 'B', 'C', 'D', 'E']) print df print df['col_sum'] = df.apply(lam

  • pandas 空数据处理方法详解

    这篇文章主要介绍了pandas 空数据处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一:直接删除 1.查看行或列是否有空格(以下的df为DataFrame类型,axis=0,代表列,axis=1代表行,以下的返回值都是行或列索引加上布尔值) isnull方法 查看行:df.isnull().any(axis=1) 查看列:df.isnull().any(axis=0) notnull方法: 查看行:df.notnull().a

  • Python pandas常用函数详解

    本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 import pandas as pd import numpy as np import matplotlib.pyplot as plt import datetime import re 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名,0,1,2,3... names=['A', 'B', 'C'...] 自定义列名 index_col='

  • Pandas时间序列基础详解(转换,索引,切片)

    时间序列的类型: 时间戳:具体的时刻 固定的时间区间:例如2007年的1月或整个2010年 时间间隔:由开始时间和结束时间表示,时间区间可以被认为是间隔的特殊情况 实验时间和消耗时间:每个时间是相对于特定开始时间的时间的量度,(例如自从被放置在烤箱中每秒烘烤的饼干的直径) 日期和时间数据的类型及工具 datetime模块中的类型: date 使用公历日历存储日历日期(年,月,日) time 将时间存储为小时,分钟,秒,微秒 datetime 存储日期和时间 timedelta 表示两个datet

  • pandas分组聚合详解

    一 前言 pandas学到分组迭代,那么基础的pandas系列就学的差不多了,自我感觉不错,知识追寻者用pandas处理过一些数据,蛮好用的: 知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 二 分组 2.1 数据准备 # -*- coding: utf-8 -*- import pandas as pd import numpy as np frame = pd.DataFrame({ '

  • python绘图pyecharts+pandas的使用详解

    pyecharts介绍 pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.用 Echarts 生成的图可视化效果非常棒 为避免绘制缺漏,建议全部安装 为了避免下载缓慢,作者全部使用镜像源下载过了 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ echarts-countries-pypkg pip install -i https://pypi.tuna.tsin

  • C/C++中I/O进阶详解及其作用介绍

    目录 概述 I/O 类库 I/O 中的重载 流对象 标准输入流 cin 流对象 案例 get 函数 getline 函数 eof 函数 cout 流对象 cerr 流对象 clog 流对象 概述 C++ 的输入 (input stream) 和输出 (output stream)是由若干字节组成的字节序列, 使得数据按顺序从一个对象传送到另一对象. 流 (stream) 表示量信息从源到目的端的流动. C++ 的输入输出包括: 标准 I/O: 对系统指定的标准设备的输入 文件 I/O: 对磁盘文

  • Java数据结构中图的进阶详解

    目录 有向图 有向图API设计 有向图的实现 拓扑排序 拓扑排序图解 检测有向图中的环 检测有向环的API设计 检测有向环实现 代码 基于深度优先的顶点排序 顶点排序API设计 顶点排序实现 代码: 有向图 有向图的定义及相关术语 定义∶ 有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着 一对有序的顶点. 出度∶ 由某个顶点指出的边的个数称为该顶点的出度. 入度: 指向某个顶点的边的个数称为该顶点的入度. 有向路径︰ 由一系列顶点组成,对于其中的每个顶点都存在一

  • C语言 指针数组进阶详解

    目录 指针与数组中的sizeof与strlen sizeof strlen 数组名 1.一维数组 整型数组 字符数组 指针数组 2.二维数组 指针笔试题 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽.接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧! 指针与数组中的sizeof与strlen sizeof sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作

随机推荐