作为数据分析师日常工作中会遇到各种各样的数据处理需求, 因为数据量巨大的原因无法手动处理表格,正好会应用Python工具,今天就借此机会来展示Pandas中Groupby与Merge处理数据表格的快捷与美化。
GROUPBY:函数主要的作用是进行数据的分组以及分组后地组内运算!groupby
的过程就是将原有的DataFrame
按照groupby
的字段(这里是company
),划分为若干个分组DataFrame
,被分为多少个组就有多少个分组DataFrame
。所以说,在groupby
之后的一系列操作(如agg
、apply
等),均是基于子DataFrame
的操作。
MERGE:数据合并时可以使用merge方法,对两个dataFrame根据某一个series合并,这个方法非常好用,只要找到了合并的标准,新的数据就可以重构出来。
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
我这里就解释两个参数
一个是on :他就相当于sql表中的外键
另一个是how:他就相当于两个表是左外连接、右外连接、内连接、全连接
一:数据处理背景以及目标
下表是需要处理的原始数据表格式:
下表是需要输出的数据表格式:
目标:分别查看各级类目的相关的销量以及件数,进行分层次化数据处理与汇总。
二:数据分层处理——GROUPBY用于将数据进行分层
#插入相应模块以备调用
import pandas as pd
import numpy as np
#读取原始数据表
df = pd.read_excel(r'C:\Users\XXXX\Desktop\练习.xlsx')
#查看相应三级类目的相关统计的信息,通过Groupby将原始便依据名称进行分层,同时计算相应的列,本实例应用的是销量、件数作为计算列。
df_yiji_xiaoliang = df.groupby('一级类目').销量.sum().reset_index(name='一级类目_销量')
df_yiji_jianshu = df.groupby('一级类目').件数.sum().reset_index(name='一级类目_件数')
#查看相应三级类目的相关统计的信息,通过Groupby将原始便依据名称进行分层,同时计算相应的列,本实例应用的是销量、件数作为计算列。
df_erji_xiaoliang = df.groupby(['一级类目', '二级类目']).销量.sum().reset_index(name='二级类目_销量')
df_erji_jianshu = df.groupby(['一级类目', '二级类目']).件数.sum().reset_index(name='二级类目_件数')
#查看相应三级类目的相关统计的信息,通过Groupby将原始便依据名称进行分层,同时计算相应的列,本实例应用的是销量、件数作为计算列。
df_sanji_xiaoliang = df.groupby(['一级类目', '二级类目', '三级类目']).销量.sum().reset_index(name='三级类目_销量')
df_sanji_jianshu = df.groupby(['一级类目', '二级类目', '三级类目']).件数.sum().reset_index(name='三级类目_件数')
三:数据分层后汇总处理——MERGE用于将各级类目数据分层后数据的相关汇总。
#将各级类目分层的相关信息,进行汇总,本实例用的是左连接
df_yiji = df_yiji_xiaoliang.merge(df_yiji_jianshu, how='left', on='一级类目')
print(df_yiji)
"""
一级类目 一级类目_销量 一级类目_件数
0 A 15 25
1 B 40 50
2 C 65 75
"""
df_erji = df_erji_xiaoliang.merge(df_erji_jianshu, how='left', on=['一级类目', '二级类目'])
print(df_erji)
"""
一级类目 二级类目 二级类目_销量 二级类目_件数
0 A a 4 8
1 A b 2 4
2 A c 4 6
···········
"""
df_sanji = df_sanji_xiaoliang.merge(df_sanji_jianshu, how='left', on=['一级类目', '二级类目', '三级类目'])
print(df_sanji)
"""
一级类目 二级类目 二级类目_销量 二级类目_件数
0 A a 4 8
1 A b 2 4
2 A c 4 6
"""
四:数据分层后汇总处理——MERGE用于将数据中各级类目进行汇总。
1、将各级类目数据进行合并汇总查看列结构:
#将一级类目、二级类目、三级类目以及相关汇总的数据进行合并
df_result = df_sanji.merge(df_yiji, how='left', on='一级类目').merge(df_erji, how='left', on=['一级类目', '二级类目'])
#查看各级类目以及相关汇总信息汇总后的列名的排列;
print(df_result.columns)
"""
Index(['一级类目', '二级类目', '三级类目', '三级类目_销量', '三级类目_件数', '一级类目_销量', '一级类目_件数',
'二级类目_销量', '二级类目_件数'],
dtype='object')
"""
2、依据需求将上一步汇总的数据进行列重新排序,以达到目标
#将初步汇总好的数据列按照目标进行排序
df_result = df_result[['一级类目','一级类目_销量', '一级类目_件数', '二级类目','二级类目_销量', '二级类目_件数', '三级类目', '三级类目_销量', '三级类目_件数']]
print(df_result.columns)
"""
Index(['一级类目', '一级类目_销量', '一级类目_件数', '二级类目', '二级类目_销量', '二级类目_件数', '三级类目',
'三级类目_销量', '三级类目_件数'],
dtype='object')
"""
print(df_result)
"""
一级类目 一级类目_销量 一级类目_件数 二级类目 二级类目_销量 二级类目_件数 三级类目 三级类目_销量 三级类目_件数
0 A 15 25 a 4 8 a1 1 3
1 A 15 25 a 4 8 a3 3 5
2 A 15 25 b 2 4 a2 2 4
···························
"""
3、将汇总好的数据进行输出——输出并新建一个excel用于存放调整好的表格
#输出处理后的文件
df_result.to_excel(r'C:\Users\XXXX\Desktop\练习结果.xlsx', index=False)
其输出好的文件:
五、完成前面内容别忘记合并单元格,因数据量很大,故对输出表进行合并:
#读取生成结果
data = pd.read_excel(r'C:\Users\fangc\Desktop\练习结果.xlsx')
#查看结果中的列名称
print(data.columns)
#依据列名称建立索引
data.set_index(['一级类目', '一级类目_销量', '一级类目_件数', '二级类目', '二级类目_销量', '二级类目_件数', '三级类目'],inplace=True)
#输出最终合并好的结果
data.to_excel(r'C:\Users\fangc\Desktop\练习结果1.xlsx', index=True)
最终结果:
以下是本次内容的全部代码:
#插入相应模块以备调用
import pandas as pd
import numpy as np
#读取原始数据表
df = pd.read_excel(r'C:\Users\XXXX\Desktop\练习.xlsx')
#查看相应各级类目的相关统计的信息,通过Groupby将原始便依据名称进行分层,同时计算相应的列,本实例应用的是销量、件数作为计算列。
#查看相应三级类目的相关统计的信息,通过Groupby将原始便依据名称进行分层,同时计算相应的列,本实例应用的是销量、件数作为计算列。
df_yiji_xiaoliang = df.groupby('一级类目').销量.sum().reset_index(name='一级类目_销量')
df_yiji_jianshu = df.groupby('一级类目').件数.sum().reset_index(name='一级类目_件数')
#将各级类目分层的相关信息,进行汇总,本实例用的是左连接
df_yiji = df_yiji_xiaoliang.merge(df_yiji_jianshu, how='left', on='一级类目')
print(df_yiji)
#查看相应三级类目的相关统计的信息,通过Groupby将原始便依据名称进行分层,同时计算相应的列,本实例应用的是销量、件数作为计算列。
df_erji_xiaoliang = df.groupby(['一级类目', '二级类目']).销量.sum().reset_index(name='二级类目_销量')
df_erji_jianshu = df.groupby(['一级类目', '二级类目']).件数.sum().reset_index(name='二级类目_件数')
df_erji = df_erji_xiaoliang.merge(df_erji_jianshu, how='left', on=['一级类目', '二级类目'])
print(df_erji)
#查看相应三级类目的相关统计的信息,通过Groupby将原始便依据名称进行分层,同时计算相应的列,本实例应用的是销量、件数作为计算列。
df_sanji_xiaoliang = df.groupby(['一级类目', '二级类目', '三级类目']).销量.sum().reset_index(name='三级类目_销量')
df_sanji_jianshu = df.groupby(['一级类目', '二级类目', '三级类目']).件数.sum().reset_index(name='三级类目_件数')
df_sanji = df_sanji_xiaoliang.merge(df_sanji_jianshu, how='left', on=['一级类目', '二级类目', '三级类目'])
print(df_erji)
#将一级类目、二级类目、三级类目以及相关汇总的数据进行合并
df_result = df_sanji.merge(df_yiji, how='left', on='一级类目').merge(df_erji, how='left', on=['一级类目', '二级类目'])
print(df_result.columns)
df_result = df_result[['一级类目','一级类目_销量', '一级类目_件数', '二级类目','二级类目_销量', '二级类目_件数', '三级类目', '三级类目_销量', '三级类目_件数']]
print(df_result.columns)
print(df_result)
#输出处理后的文件
df_result.to_excel(r'C:\Users\XXXX\Desktop\练习结果.xlsx', index=False)
#读取生成结果
data = pd.read_excel(r'C:\Users\XXXX\Desktop\练习结果.xlsx')
#查看结果中的列名称
print(data.columns)
#依据列名称建立索引
data.set_index(['一级类目', '一级类目_销量', '一级类目_件数', '二级类目', '二级类目_销量', '二级类目_件数', '三级类目'],inplace=True)
#输出最终合并好的结果
data.to_excel(r'C:\Users\XXXX\Desktop\练习结果1.xlsx', index=True)
这份需求算是算满结束,初学者刚了解该相关内容,如其中有错误,以及有更好的方式欢迎大家留言.
人生苦常,寻找快乐