Python处理Excel表格——了解Groupby与merge的用法

作为数据分析师日常工作中会遇到各种各样的数据处理需求, 因为数据量巨大的原因无法手动处理表格,正好会应用Python工具,今天就借此机会来展示Pandas中Groupby与Merge处理数据表格的快捷与美化。

GROUPBY:函数主要的作用是进行数据的分组以及分组后地组内运算!groupby的过程就是将原有的DataFrame按照groupby的字段(这里是company),划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。所以说,在groupby之后的一系列操作(如aggapply等),均是基于子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:他就相当于两个表是左外连接、右外连接、内连接、全连接

项目实例:

一:数据处理背景以及目标

下表是需要处理的原始数据表格式:

Python处理Excel表格——了解Groupby与merge的用法_第1张图片

 下表是需要输出的数据表格式:

Python处理Excel表格——了解Groupby与merge的用法_第2张图片

 目标:分别查看各级类目的相关的销量以及件数,进行分层次化数据处理与汇总。

二:数据分层处理——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)

其输出好的文件:

Python处理Excel表格——了解Groupby与merge的用法_第3张图片

五、完成前面内容别忘记合并单元格,因数据量很大,故对输出表进行合并:

#读取生成结果
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)

 最终结果:

Python处理Excel表格——了解Groupby与merge的用法_第4张图片

以下是本次内容的全部代码:

#插入相应模块以备调用
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)

 

这份需求算是算满结束,初学者刚了解该相关内容,如其中有错误,以及有更好的方式欢迎大家留言.

人生苦常,寻找快乐

你可能感兴趣的:(python,pycharm,大数据,pandas,numpy)