首页 > 编程语言 >python-数据分析-Pandas-4、DataFrame-数据透视

python-数据分析-Pandas-4、DataFrame-数据透视

时间:2024-06-10 14:11:13浏览次数:16  
标签:... python 销售 df1 DataFrame 销售额 print NaN Pandas

经过前面的学习,我们已经将数据准备就绪而且变成了我们想要的样子
接下来就是最为重要的数据透视阶段了。当我们拿到一大堆数据的时候,如何从数据中迅速的解读出有价值的信息
把繁杂的数据变成容易解读的统计图表并再此基础上产生业务洞察,这就是数据分析要解决的核心问题。

数据透视

# -*- coding: utf-8 -*-
#数据透视

import numpy
import pandas

scores = numpy.random.randint(50, 101, (5, 3))  # 生成5行3列的随机整数矩阵
names = ('关羽', '张飞', '赵云', '马超', '黄忠')
courses = ('语文', '数学', '英语')
# 生成DataFrame
#index: 索引列(第一列)
#columns: 表头
df = pandas.DataFrame(data=scores, columns=courses, index=names)
print(df)
'''
    语文  数学  英语
关羽  77  74  70
张飞  64  93  64
赵云  75  50  97
马超  90  86  76
黄忠  52  58  75
'''

#我们可以通过DataFrame对象的方法:
# mean、max、min、std、var等方法分别获取每个学生或每门课程的平均分、最高分、最低分、标准差、方差等信息,
# 也可以直接通过describe方法直接获取描述性统计信息
print(df.mean())
print(df.mean(axis=1))  # axis=1表示按行计算
print(df.var()) # 方差
print(df.describe())  # 统计信息 -推荐

print('-------------------------------------')
#排序和取头部值""

# 排序 sort_values(by='指定哪一列进行排序', ascending=True/False) 默认升序True
print(df.sort_values(by='语文', ascending=False))

#nlargest和nsmallest方法就提供对Top-N操作 - 如取排名前几名的数据
#找出语文成绩前3名的学生
#df.nalargest(n, columns, keep='first') 参数n表示取前几名,columns表示哪一列,keep表示保留排名前几名的数据
print(df.nlargest(3, '语文'))

#找出数学成绩最低的3名学生的信息。
print(df.nsmallest(3, '数学'))

print('========================================================================')

#分组聚合
df1 = pandas.read_excel('file/2020年销售数据.xlsx')
print(df1.head())

# 统计每个销售区域的销售总额
#1、先通过“售价”和“销售数量”计算出销售额,为DataFrame添加一个列
df1['销售额'] = df1['售价'] * df1['销售数量']    #
print(df1.head())
'''
  销售日期 销售区域 销售渠道   销售订单   品牌   售价  销售数量    销售额
0 2020-01-01   上海  拼多多  182894-455  八匹马   99    83   8217
1 2020-01-01   上海   抖音  205635-402  八匹马  219    29   6351
2 2020-01-01   上海   天猫  205654-021  八匹马  169    85  14365
3 2020-01-01   上海   天猫  205654-519  八匹马  169    14   2366
4 2020-01-01   上海   天猫  377781-010  皮皮虾  249    61  15189
'''

# 2、 再根据“销售区域”列对数据进行分组,这里我们使用的是DataFrame对象的groupby方法。分组之后,我们取“销售额”这个列在分组内进行求和处理
print(df1.groupby('销售区域').销售额.sum())
'''
销售区域    (这一列就是一个区域销售额的总和)
上海    11610489      
北京    12477717
安徽      895463
广东     1617949
江苏     2304380
浙江      687862
福建    10178227
Name: 销售额, dtype: int64
'''

#如果我们要统计每个月的销售总额,我们可以将“销售日期”作为groupby`方法的参数,当然这里需要先将“销售日期”处理成月
#df1['销售日期'].dt.month # 获取月份
#df1['销售日期'].dt.year  # 获取年份
#df1['销售日期'].dt.day  # 获取日
print(df1.groupby(df1['销售日期'].dt.month).销售额.sum())
'''
销售日期
1     5409855
2     4608455
3     4164972
4     3996770
5     3239005
6     2817936
7     3501304
8     2948189
9     2632960
10    2375385
11    2385283
12    1691973
Name: 销售额, dtype: int64
'''
# 3、统计每个销售区域每个月的销售总额
#groupby方法的第一个参数可以是一个列表,列表中可以指定多个分组的依据
print(df1.groupby(['销售区域', df1['销售日期'].dt.month]).销售额.sum())
'''
销售区域  销售日期
上海    1       1679125
      2       1689527
      3       1061193
      4       1082187
      5        841199
      6        785404
      7        863906
      8        734937
      9       1107693
      10       412108
      11       825169
      12       528041
北京    1       1878234
      2       1807787
      3       1360666
      4       1205989
      5        807300
      6       1216432
      7       1219083
      8        645727
      9        390077
      10       671608
      11       678668
      12       596146
安徽    4        341308
      5        554155
广东    3        388180
      8        469390
      9        365191
      11       395188
江苏    4        537079
      7        841032
      10       710962
      12       215307
浙江    3        248354
      8        439508
福建    1       1852496
      2       1111141
      3       1106579
      4        830207
      5       1036351
      6        816100
      7        577283
      8        658627
      9        769999
      10       580707
      11       486258
      12       352479
Name: 销售额, dtype: int64
'''

#统计出每个区域的销售总额以及每个区域单笔金额的最高和最低
#在DataFrame或Series对象上使用agg方法并指定多个聚合函数
print(df1.groupby('销售区域').销售额.agg(['sum', 'max', 'min']))
'''
           sum     max   min
销售区域                        
上海    11610489  116303   948
北京    12477717  133411   690
安徽      895463   68502  1683
广东     1617949  120807   990
江苏     2304380  114312  1089
浙江      687862   90909  3927
福建    10178227   87527   897
'''

#自定义聚合后的列的名字,可以使用如下所示的方法
print(df1.groupby('销售区域').销售额.agg(销售总额='sum', 最高销售额='max', 最低销售额='min'))
'''
          销售总额   最高销售额  最低销售额
销售区域                         
上海    11610489  116303    948
北京    12477717  133411    690
安徽      895463   68502   1683
广东     1617949  120807    990
江苏     2304380  114312   1089
浙江      687862   90909   3927
福建    10178227   87527    897
'''

#对多个列使用不同的聚合函数,例如“统计每个销售区域销售额的总和以及销售数量的最低值和最高值”
print(df1.groupby('销售区域')[['销售额', '销售数量']].agg({'销售额': 'sum', '销售数量': ['max', 'min']}))
'''
           销售额 销售数量    
           sum  max min
销售区域                   
上海    11610489  100  10
北京    12477717  100  10
安徽      895463   98  16
广东     1617949   98  10
江苏     2304380  100  11
浙江      687862   95  20
福建    10178227  100  10
'''

print('========================================================')
#透视表和交叉表
#在实际工作中我们通常把那些行很多列很少的表成为“窄表”
#如果我们不想得到这样的一个“窄表”,可以使用DataFrame的pivot_table方法或者是pivot_table函数来生成透视表。
# 透视表的本质就是对数据进行分组聚合操作 根据 A 列对 B 列进行统计
#例如,我们要“统计每个销售区域的销售总额”,那么“销售区域”就是我们的 A 列,而“销售额”就是我们的 B 列
#在pivot_table函数中分别对应index和values参数,这两个参数都可以是单个列或者多个列
#pandas.pivot_table(data, index, values, aggfunc=指定聚合函数)
print(pandas.pivot_table(df1, index='销售区域', values='销售额', aggfunc='sum'))
'''
          销售额
销售区域          
上海    11610489
北京    12477717
安徽      895463
广东     1617949
江苏     2304380
浙江      687862
福建    10178227

#注意:上面的结果操作跟之前用groupby的方式得到的结果有一些区别,
#groupby操作后,如果对单个列进行聚合,得到的结果是一个Series对象,
#而上面的结果是一个DataFrame 对象。
'''

#统计每个销售区域每个月的销售总额,也可以使用pivot_table函数
df1['月份'] = df1['销售日期'].dt.month
print(pandas.pivot_table(df1, index=['销售区域', '月份'], values='销售额', aggfunc='sum'))
'''
             销售额
销售区域 月份         
上海   1   1679125
     2   1689527
     3   1061193
     4   1082187
     5    841199
     6    785404
     7    863906
     8    734937
     9   1107693
     10   412108
     11   825169
     12   528041
北京   1   1878234
     2   1807787
     3   1360666
     4   1205989
     5    807300
     6   1216432
     7   1219083
     8    645727
     9    390077
     10   671608
     11   678668
     12   596146
安徽   4    341308
     5    554155
广东   3    388180
     8    469390
     9    365191
     11   395188
江苏   4    537079
     7    841032
     10   710962
     12   215307
浙江   3    248354
     8    439508
福建   1   1852496
     2   1111141
     3   1106579
     4    830207
     5   1036351
     6    816100
     7    577283
     8    658627
     9    769999
     10   580707
     11   486258
     12   352479

#上面的操作结果是一个DataFrame,但也是一个长长的“窄表”
'''
#做成一个行比较少列比较多的“宽表”,可以将index参数中的列放到columns参数中
#说明:pivot_table函数的fill_value=0会将空值处理为0。
print(pandas.pivot_table(df1, index='销售区域', columns='月份', values='销售额', aggfunc='sum', fill_value=0))
'''
月份           1          2          3   ...        10        11        12
销售区域                                   ...                              
上海    1679125.0  1689527.0  1061193.0  ...  412108.0  825169.0  528041.0
北京    1878234.0  1807787.0  1360666.0  ...  671608.0  678668.0  596146.0
安徽          NaN        NaN        NaN  ...       NaN       NaN       NaN
广东          NaN        NaN   388180.0  ...       NaN  395188.0       NaN
江苏          NaN        NaN        NaN  ...  710962.0       NaN  215307.0
浙江          NaN        NaN   248354.0  ...       NaN       NaN       NaN
福建    1852496.0  1111141.0  1106579.0  ...  580707.0  486258.0  352479.0

[7 rows x 12 columns]
'''

#使用pivot_table函数时,还可以通过添加margins和margins_name参数对分组聚合的结果做一个汇总,具体的操作和效果如下所示。
print(pandas.pivot_table(df1, index='销售区域', columns='月份', values='销售额', aggfunc='sum', fill_value=0, margins=True, margins_name='总计'))
'''
月份          1        2        3        4  ...       10       11       12        总计
销售区域                                      ...                                     
上海    1679125  1689527  1061193  1082187  ...   412108   825169   528041  11610489
北京    1878234  1807787  1360666  1205989  ...   671608   678668   596146  12477717
安徽          0        0        0   341308  ...        0        0        0    895463
广东          0        0   388180        0  ...        0   395188        0   1617949
江苏          0        0        0   537079  ...   710962        0   215307   2304380
浙江          0        0   248354        0  ...        0        0        0    687862
福建    1852496  1111141  1106579   830207  ...   580707   486258   352479  10178227
总计    5409855  4608455  4164972  3996770  ...  2375385  2385283  1691973  39772087

[8 rows x 13 columns]
'''

#交叉表
#交叉表就是一种特殊的透视表,它不需要先构造一个DataFrame对象,
# 而是直接通过数组或Series对象指定两个或多个因素进行运算得到统计结果
#统计每个销售区域的销售总额
sales_area, sales_month, sales_amount = df1['销售区域'], df1['月份'], df1['销售额']
#使用crosstab函数生成交叉表
#说明:上代码使用了DataFrame对象的fillna方法将空值处理为0,再使用astype方法将数据类型处理成整数。
print(pandas.crosstab(index=sales_area, columns=sales_month, values=sales_amount, aggfunc='sum').fillna(0).astype('i8'))
'''
月份         1        2        3        4   ...       9       10      11      12
销售区域                                      ...                                 
上海    1679125  1689527  1061193  1082187  ...  1107693  412108  825169  528041
北京    1878234  1807787  1360666  1205989  ...   390077  671608  678668  596146
安徽          0        0        0   341308  ...        0       0       0       0
广东          0        0   388180        0  ...   365191       0  395188       0
江苏          0        0        0   537079  ...        0  710962       0  215307
浙江          0        0   248354        0  ...        0       0       0       0
福建    1852496  1111141  1106579   830207  ...   769999  580707  486258  352479

[7 rows x 12 columns]
'''

print('================================================================================')

#数据呈现
#和Series一样,DataFrame对象提供了plot方法来支持绘图,底层仍然是通过matplotlib库实现图表的渲染
import matplotlib.pyplot as plt
#FZJKai-Z03S是我电脑上已经安装的一种支持中文的字体的名称,
# 字体的名称可以通过查看用户主目录下.matplotlib文件夹下名为fontlist-v330.json的文件来获得,而这个文件在执行上面的命令后就会生成
#可以尝试使用SimHei(黑体)、SimSun(宋体)或者其他专门设计用于支持中文的字体CJK
plt.rcParams['font.sans-serif'] = ['SimHei']
# %config InlineBackend.figure_format = svg
temp = pandas.pivot_table(df1, index='销售区域', values='销售额', aggfunc='sum')
temp.plot(figsize=(8, 4), kind='bar', title='销售总额')
plt.xticks(rotation=0)
# plt.show()

#如果要绘制饼图,可以修改plot方法的kind参数为pie,然后使用定制饼图的参数对图表加以定制,代码如下所示。
temp.sort_values(by='销售额', ascending=False).plot(
    figsize=(6, 6),
    kind='pie',
    y='销售额',
    ylabel='',
    autopct='%.2f%%',
    pctdistance=0.8,
    wedgeprops=dict(linewidth=1, width=0.35),
    legend=False
)
plt.show()

 

标签:...,python,销售,df1,DataFrame,销售额,print,NaN,Pandas
From: https://www.cnblogs.com/littlecc/p/18240635

相关文章

  • python-pip配置镜像源加速下载Python包安装:快速配置pip源-国内加速源
    目录一、简介二、国内常用加速源 三、配置pip加速源1.临时配置2.永久配置a.配置命令b.查看是否配置成功c.还原配置一、简介pip的原本安装源是PythonPackageIndex(PyPI)的官方源,其URL为https://pypi.org/simple/。PyPI是Python社区用来发布和共享软件包的官方仓......
  • Python程序操作MySQL数据库教程
    1.Python程序操作MySQL数据库:使用pymysql安装包使用:1.导入pysql包importpymysql2.创建连接对象调用pymysql模块中的connect()函数来创建连接对象,代码如下:连接对象说明:关闭连接conn.close()提交数据conn.commit()撤销数据conn.rollback()3.获取游标对象获取......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 机场航班调度程序(100分) - 三语言A
    ......
  • python-数字黑洞
    [题目描述]给定一个三位数,要求各位不能相同。例如,352是符合要求的,112是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。神奇的是,最终一定会得到495!试试看,重新排列352,得到的最大数为......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 最富裕的小家庭(100分) - 三语言AC
    ......
  • Python爬虫:通过js逆向了解某音请求接口参数a_bogus加密过程
    1.前言需要提前说明以下,本篇文章讲述的内容仅供学习,切莫用于商业活动,如若被相关人员发现,本小编概不负责!切记。。本次分析的接口为:https://www.douyin.com/aweme/v1/web/discover/search/它的请求方式为:GET请求需要的参数有:请求参数中需要进行js逆向是:a_bogus必须需要的请......
  • python实现自定义线程池
    线程池ThreadPool对象的几个关键方法:get_idle_num():获得当前空闲线程的数量submit(task:callable):把一个任务(实际上就是一个函数)提交到线程池中执行.如果没有空闲线程则阻塞.wait_idle():阻塞,直到有空闲线程stop():停止线程池中的所有线程.(注意:非强制停止,......
  • Python 中 `return` 语句的主要作用
    在Python中,`return`语句用于从函数中返回一个值,并终止函数的执行。`return`语句是函数中最重要的控制流语句之一,它决定了函数的输出和执行流程。以下是`return`语句的主要作用和一些示例:###主要作用1. 返回值:  -`return`语句将一个值(或多个值)从函数传递给调用者。这......
  • python里装饰器的作用是什么
    在Python中,装饰器(decorator)是一种高级函数,用于修改或扩展其他函数或方法的行为,而无需直接修改它们的代码。装饰器常用于以下场景:日志记录:记录函数的调用信息,如函数名、参数和返回值。权限验证:在执行函数前检查用户是否有权限。性能测量:测量函数的执行时间。缓存:缓存函数的返回......
  • Python魔法之旅-魔法方法(25)
    目录一、概述1、定义2、作用二、应用场景1、构造和析构2、操作符重载3、字符串和表示4、容器管理5、可调用对象6、上下文管理7、属性访问和描述符8、迭代器和生成器9、数值类型10、复制和序列化11、自定义元类行为12、自定义类行为13、类型检查和转换14、自......