欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python数据清洗--数据统计

程序员文章站 2022-04-28 18:51:10
...

1. 数据分组运算

python数据清洗--数据统计
分组计算根据某个或者某几个字段对数据集进行分组,然后运用特定的函数,得到结果
• 使用groupby方法进行分组计算,得到分组对象GroupBy
• 语法为df.groupby(by=)
• 分组对象GroupBy可以运用描述性统计方法, 如count、mean 、median、 max和min等
Group = loan_info.groupby(by = 'product’)
group1= loan_info.groupby(by = [‘product’,'jgmc’])
Group.mean()
Group.sum()
Group.max()

import pandas as pd
import numpy as np
import os
os.chdir(r'F:\CSDN\课程内容\代码和数据')
df = pd.read_csv('online_order.csv',encoding = 'gbk',dtype={'customer':str,'order':str})
df.dtypes
df.head(4)#查看数据
grouped = df.groupby('weekday') #创建分组对象,按照星期进行分组
grouped.mean() #调用方法
grouped.sum()['total_items']# 计算不同的星期,商品数量的总和
grouped = df.groupby(by =['customer','weekday'])#创建分组对象,按照用户和星期
grouped.sum()['total_items'].head(50) #调用方法,计算不同的用户周一到周天的订购商品数量的总和

2. 聚合函数使用

• 对分组对象使用agg聚合函数,agg是一个作用于series或者DataFrame的函数,主要目的是针对分组后的对象,使用相关函数进行计算
• Groupby.agg(func)
• 针对不同的变量使用不同的统计方法
grouped.agg([np.mean,np.max]).head(20)
grouped.agg({‘ye’:np.mean,‘dkje’:np.max})
loan_info[[‘dkje’,‘ye’,‘yqje’]].agg([np.sum,np.mean])

grouped = df.groupby('weekday')#创建分组对象,按照周一到周天进行分组
grouped.agg([np.mean,np.max]).head(20) #对分组后对象,计算均值和总和
grouped.agg({'total_items':np.sum,'Food%': [np.mean,np.median]}) #对2个变量分别计算不同的统计量
df[['total_items','Food%','Drinks%']].agg([np.sum,np.mean]) #也可以直接对数据进行汇总

3. 分组对象和apply函数

• 函数apply即可用于分组对象,也可以作用于dataframe数据
• Groupby.apply(func)
• 需要注意axis=0和axis=1的区别
loan_info.apply(np.sum,axis = 0) #相当于计算每列的均值
loan_info[‘sum’] = loan_info.apply(np.sum,axis=1) # 相当于计算每行的总和
loan_info[[‘dkje’,‘ye’]].apply(lambda x: x[0] - x[1],axis = 1) #计算两个变量的差值

grouped = df.groupby('weekday')
grouped.apply(np.mean)[['total_items','Food%']] #可以做聚合
#体验一下apply 中,axis=0 或者 axis=1的区别,0代表沿着行的方向作用,1代表沿着列的方向作用
df.columns
var_name = ['Food%', 'Fresh%', 'Drinks%', 'Home%', 'Beauty%', 'Health%', 'Baby%',  'Pets%'] # 不同类型的商品占比
df[var_name].apply(np.sum,axis = 0) #相当于计算每列的总和
df['sum'] = df[var_name].apply(np.sum,axis=1) #  相当于计算每行的总和
var_name.append('sum')
df[var_name] #查看数据,会发现总和为1
df[var_name].apply(lambda x: x[0] - x[1],axis = 1) #计算食物在订单总价中占比 - 生鲜类食物在订单总中占比

4. 透视图与交叉表

在数据分析中,数据透视表是常见的工具之一,需要根据行或列对数据
进行各个维度数据的汇总,在pandas中,提供了相关函数解决此类问题
交叉表更多用于频数的分析
pivot_table( data, index, columns,values, aggfunc, fill_value,margins, margins_name=)

  • Index : 行分组键
  • columns: 列分组键
  • values: 分组的字段,只能为数值型变量
  • aggfunc: 聚合函数
  • margins: 是否需要总计

交叉表用于计算分组频率
pd.crosstab(index,columns,normalize)

  • Index: 行索引
  • Columns: 列索引
  • Normalize: 数据对数据进行标准化,index表示行,column表示列
#读取数据
df = pd.read_csv('online_order.csv',encoding = 'gbk',dtype={'customer':int,'order':str})
df.columns
# 单个变量
#margin =True 表示是否需要总计
pd.pivot_table(data= df,index='weekday',values='total_items',aggfunc=[np.sum,np.size],margins=True,margins_name='总计')#按照周一到周天计算购买的商品数量总数和次数
# 使用交叉表
#是一种计算分组频数的特殊透视表
# 不同的星期,不同的折扣交叉表
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True)
#按照行进行汇总,计算频数占比
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True, normalize='all')
#按照行进行汇总,计算频数占比
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True,  normalize='all') #index表示计算行百分比,columns表示计算列百分比
pd.crosstab(index =df['weekday'], columns=df['discount%'],margins=True, normalize='columns') #index表示计算行百分比,columns表示计算列百分比