Python全栈开发-数据分析-03 Pandas详解 (下)

Pandas详解 (下)

一. Excel文件的拆分与合并

1.1 一个文件夹下多个工作簿的合并【单独Sheet】

思路:

1,把文件夹下面所有的文件都遍历出来
2、循环读取每个文件
(1)第一次读取的文件放入一个空的表中,起名叫合并表
(2)从第二次开始每次都与这个合并表进行合并
3、写入Excel
4、所有表表头行数要一至,通过header=1进行设置

案例:
首先我们先看一下三个表的内容:
在这里插入图片描述

import pandas as pd
import os
path = 'E:/Desktop/科学计算/Pandas课件/pandas教程/课件025/课件025/'
all_excel = pd.DataFrame()
for name in os.listdir(path):
    table = pd.read_excel(path + name)
    all_excel =pd.concat([all_excel,table])
print(all_excel)

运行结果为:

          日期   姓名 性别
0 2020-05-01   张三  男
1 2020-05-02   李四  女
2 2020-05-03   王五  男
0 2020-05-01   叶问  男
1 2020-05-02  李小龙  男
2 2020-05-03  落空空  男
0 2020-05-01  孙悟空  男
1 2020-05-02  猪八戒  男
2 2020-05-03  沙和尚  男

1.2 同一工作簿中多个Sheet合并

案例:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件025\课件025-3\合并2.xlsx'
data = pd.read_excel(path,None)
all_table = pd.DataFrame()
name = list(data.keys()) # 返回['序号', '姓名', '电话']
for lie in name:
    new_data = data[lie]
    all_table = pd.concat([all_table,new_data])
print(data)

运行结果为:

{'Sheet3':    序号 姓名   电话
0   1  A  123
1   2  B  456
2   3  C  789, 'Sheet2':    序号 姓名   电话
0   1  D  678
1   2  E  901
2   3  F  991, 'Sheet1':    序号 姓名   电话
0   1  X  555
1   2  Y  666
2   3  Z  777}

1.3 将一个工作表拆分成多个工作表

原数据:
在这里插入图片描述
案例:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件025\课件025-3\拆分.xlsx'
data = pd.read_excel(path)
lie = list(data['部门'].drop_duplicates()) # 返回:['办公室', '销售部', '保洁部'],笔记13.1
new_data = pd.ExcelWriter(r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件025\课件025-3\多个.xlsx')
for i in lie:
    data1 = data[data['部门'] == i]
    data1.to_excel(new_data,sheet_name=i)
new_data.save()
new_data.close()

运行结果为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4 将一个工作表拆分成多个工作簿

案例:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件025\课件025-3\拆分.xlsx'
data = pd.read_excel(path)
lie = list(data['部门'].drop_duplicates()) # 返回:['办公室', '销售部', '保洁部']
for i in lie:
    data1 = data[data['部门'] == i]
    data1.to_excel(r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件025\课件025-3\\' + i + '.xlsx')

运行结果为:
在这里插入图片描述

二. 分组与聚合groupby基础部分

groupby分为三个步骤:拆分-应用-合并
DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。
然后,将一个函数应用到各个分组并产生新值。
最后,所有这些函数的执行结果会被合并到最终的结果对象中去。
GroupBy的size方法可以返回一个含有分组大小的Series。

2.1 对分组进行迭代【遍历各分组】

案例:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合.xlsx'
data = pd.read_excel(path)
for (i,j),group in data.groupby(['城市','区']):
    print(i) # 城市分组
    print(j) # 区分组
    print(group) # 城市和区的分组
    print('==='*20)

运行结果为:

北京市
东城区
    城市    区  人数  金额
2  北京市  东城区  40  80
7  北京市  东城区  48  96
============================================================
北京市
西城区
    城市    区  人数  金额
0  北京市  西城区  37  74
4  北京市  西城区  49  98
8  北京市  西城区  26  52
============================================================
天津
南开区
   城市    区  人数  金额
3  天津  南开区  34  68
5  天津  南开区  44  88
9  天津  南开区  30  60
============================================================
天津
和平区
   城市    区  人数  金额
1  天津  和平区  48  96
6  天津  和平区  49  98
============================================================

2.2 分组聚合

案例1:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合.xlsx'
data = pd.read_excel(path)
data2 = data.groupby(['城市','区'])[['人数']].sum()
print(data2)

运行结果为:

          人数
城市  区       
北京市 东城区   88
    西城区  112
天津  南开区  108
    和平区   97

案例2:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合.xlsx'
data = pd.read_excel(path)
data2 = data.groupby(['城市','区'])[['人数','金额']].sum()
print(data2)

运行结果为:

          人数   金额
城市  区            
北京市 东城区   88  176
    西城区  112  224
天津  南开区  108  216
    和平区   97  194

案例3:
数据如下;
在这里插入图片描述

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合2.xlsx'
data = pd.read_excel(path,index_col='店号')
#不同列的不同计算方法
dict1 = {'1月':'count','2月':sum,'3月':max,'4月':'mean'}
data2 = data.groupby('店号').agg(dict1)
print(data2)

运行结果为:

      1234月
店号                  
1051  84  95  37
11  77  76  29
2251  77  76  28
251  80  44  28
21  84  95  75
351  25  95  37

注意:
如果按一列聚合,只传列名字符串,如果多个就要传由列名组成的列表
聚合方法可以使用 Pandas 的数学统计函数 或者 Numpy 的统计函数
如果是 python 的内置统计函数,直接使用变量,不需要加引号

2.3 使用字典和Series分组

案例:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合2.xlsx'
data = pd.read_excel(path,index_col='店号')
rela = {'1月':'一季度','2月':'一季度','3月':'一季度','4月':'二季度'}
data2 = data.groupby(rela,axis=1)
print(data2.sum())

运行结果为:

      一季度  二季度
店号            
1178   29
2228   75
25181   28
35166   37
105236   37
225210   28

2.4 通过函数分组 【不常用】

例1:按城市名称的字数进行分组聚合

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合.xlsx'
data = pd.read_excel(path,index_col='城市')
data2 = data.groupby(len).sum()
print(data2)

运行结果为:

    人数   金额
2  205  410
3  200  400

案例2:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合2.xlsx'
data = pd.read_excel(path,index_col='店号')
S1 = ['北京','北京','北京','北京','天津','天津']
data2= data.groupby([len,S1]).min()
print(data2)

运行结果为:

      12342 北京  25  77  76  29
3 北京  46  25  44  28
4 天津  57  77  76  28

2.5 通过索引级别分组

案例1:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合3.xlsx'
data = pd.read_excel(path,index_col=[0,1])
data3 = data.groupby(level='班级').mean()
print(data3)

运行结果为:

      语文    数学
班级            
一班  65.5  72.0
三班  50.5  77.0
二班  52.5  67.0
四班  71.0  68.5

案例2:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件026\分组聚合3.xlsx'
data = pd.read_excel(path,header=[0,1])
L1 = ['1季度','1季度','1季度','2季度','2季度']
L2 = ['1月','2月','3月','4月','5月']
many = pd.MultiIndex.from_arrays([L1,L2],names=['季度','月份']) # 笔记15.2
data2 = pd.DataFrame(data,columns=many)
data3 = data2.groupby(level='季度',axis=1).sum()
print(data3)

运行结果为:

季度  1季度  2季度
0   0.0  0.0
1   0.0  0.0
2   0.0  0.0
3   0.0  0.0
4   0.0  0.0
5   0.0  0.0
6   0.0  0.0

三. 分组对象和创建

3.1 isin()接受一个列表,判断该列中元素是否在列表中

isin()的逆函数:
告诉你没有isnotin,它的反函数就是在前面加上 ~ ,其他用法
同上。

3.2 Pandas函数的应用

Pandas 函数应用,要将自定义或其他库的函数应用于Pandas对象,有三个重要的方法,下面来讨论如何使用这些方法。
使用适当的方法取决于函数是否期望在整个DataFrame行或列或元素上进行操作。

类型函数说明
表式函数应用pipe()可以通过将函数和适当数量的参数作为管道参数来执行自定义操作,从而对整个DataFrame执行操作。
行列函数应用apply()沿DataFrame或Panel的轴应用任意函数,它与描述性统计方法一样,apply()方法使用一个可选的axis参数。
元素函数应用applymap()和Series上的map()类似,接受任何Python函数,该函数要求能够接受单个值并返回单个值。

3.3 案例

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件027\分组.xlsx'
data = pd.read_excel(path)
print(data)
print('==='*20)
# 按索引的奇偶行分组
data2 = data.groupby(data.index%2==0)[['语文','数学','英语']].sum()
print(data2)
print('==='*20)
# 按前后5个分组
data3 = data.groupby(data.index >= 5)[['语文','数学','英语']].sum()
print(data3)
print('==='*20)
# 按姓氏或首字母分组
data4 = data.groupby(data.姓名.str[0])[['语文','数学','英语']].sum()
print(data4)
print('==='*20)
# 按姓名第1和第2个字或第1和第2个字母分组,注意两个str要写在列表中
data4_2 = data.groupby([data.姓名.str[0],data.姓名.str[1]])[['语文','数学','英语']].sum()
print(data4_2)
print('==='*20)
# 按指定班级分组(不需要全部班级时使用)
data5 = data.groupby(data.班级.isin(['1班','2班']))[['语文','数学','英语']].sum()
print(data5)
print('==='*20)
# 按指定班级分组(不包括1班和2班的其它班级,记住~加的位置,没有isnotin函数)
data6 = data.groupby(~data.班级.isin(['1班','2班']))[['语文','数学','英语']].sum()
print(data6)
print('==='*20)
# 按日期小时分组
data7 = data.groupby([data.时间.dt.date,data.时间.dt.hour])[['语文','数学','英语']].sum()
print(data7)
print('==='*20)
# 按日期中的年份分组
data8 = data.groupby([data.时间.dt.year])[['语文','数学','英语']].sum()
print(data8)
print('==='*20)
# 利用表格函数pipe直接使用分组方法
data9 = data.pipe(pd.DataFrame.groupby,'班级').sum()
print(data9)

运行结果为:

     学号                  时间   姓名  班级 性别  数学  语文  英语
0  A001 2020-05-01 17:00:00  丁智敏  1班  女  54  34  51
1  A002 2020-05-02 18:00:00  李平平  3班  女  68  48  41
2  A003 2020-05-02 09:00:00   张伊  2班  女  32  65  40
3  A004 2020-05-01 08:00:00   王刚  4班  男  70  50  37
4  A005 2020-05-01 17:00:00   王松  3班  男  59  55  39
5  A006 2020-05-02 18:00:00  卢海军  2班  男  56  40  39
6  A007 2020-05-01 08:00:00  李永兴  1班  男  43  53  42
7  A008 2020-05-02 09:00:00   王硕  4班  女  68  68  69
8  A009 2020-05-01 17:00:00   李超  3班  男  38  35  51
9  A010 2020-05-02 18:00:00  张荣耀  1班  男  67  65  36
============================================================
        语文   数学   英语
False  271  329  222
True   242  226  223
============================================================
        语文   数学   英语
False  252  283  208
True   261  272  237
============================================================
     语文   数学   英语
姓名               
丁    34   54   5140   56   39130   99   76136  149  134173  197  145
============================================================
       语文  数学  英语
姓名 姓名            
丁  智   34  54  51
卢  海   40  56  39
张  伊   65  32  4065  67  36
李  平   48  68  4153  43  4235  38  51
王  刚   50  70  3755  59  3968  68  69
============================================================
        语文   数学   英语
班级                  
False  256  303  237
True   257  252  208
============================================================
        语文   数学   英语
班级                  
False  257  252  208
True   256  303  237
============================================================
                语文   数学   英语
时间         时间               
2020-05-01 8   103  113   79
           17  124  151  141
2020-05-02 9   133  100  109
           18  153  191  116
============================================================
       语文   数学   英语
时间                 
2020  513  555  445
============================================================
     数学   语文   英语
班级               
1164  152  129
288  105   79
3165  138  131
4138  118  106

四. 数据透视

pivot_table(data, values=None, index=None, columns=None,aggfunc=‘mean’, fill_value=None, margins=False, dropna=True,
margins_name=‘All’)
pivot_table有四个最重要的参数index、values、columns、aggfunc,本文以这四个参数为中心讲解pivot操作是如何进行。

在需要多个group by的时候,可以优先考虑此函数
先查看一下数据:一共1221条
在这里插入图片描述

案例1:index需要聚合的列名,默认情况下聚合所有数据值的列

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件028-029\透视.xlsx'
data = pd.read_excel(path)
data2 = pd.pivot_table(data,index=['部门','销售人员'])
print(data2)

运行结果为:

                成本           数量        金额
部门  销售人员                                 
办公室 郑浪    5.657143   908.285714  5.714286
客服  蒋波    5.500000   659.401639  5.377049
    赵温江   5.279412  1108.073529  5.735294
财务  冯文    5.490323   284.264516  5.793548
    熊牧    5.491525   482.423729  5.559322
销售  李平平   5.472906   112.679803  5.349754
    王松    5.444640   117.539543  5.604569
    郑浪    4.777778  1636.666667  5.444444

案例2: values在结果透视的行上进行分组的列名或其它分组键【就是透视表里显示的列】

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件028-029\透视.xlsx'
data = pd.read_excel(path)
data2 = pd.pivot_table(data,index=['部门','销售人员'],values=['数量','金额'])
print(data2)

运行结果为:

                   数量        金额
部门  销售人员                       
办公室 郑浪     908.285714  5.714286
客服  蒋波     659.401639  5.377049
    赵温江   1108.073529  5.735294
财务  冯文     284.264516  5.793548
    熊牧     482.423729  5.559322
销售  李平平    112.679803  5.349754
    王松     117.539543  5.604569
    郑浪    1636.666667  5.444444

案例3:columns在结果透视表的列上进行分组的列名或其它分组键

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件028-029\透视.xlsx'
data = pd.read_excel(path)
data2 = pd.pivot_table(data,index=['部门','销售人员'],values=['数量','金额'],columns='所属区域')
print(data2)

运行结果为:

                   数量                                                      \
所属区域               四川           山东           河北           河南           湖北   
部门  销售人员                                                                    
办公室 郑浪    1160.000000          NaN   945.000000  1270.909091   141.111111   
客服  蒋波     869.235294   250.000000   364.307692   781.365854   586.416667   
    赵温江   1419.000000  1310.500000  1325.181818   637.111111  1103.333333   
财务  冯文     286.487805   384.615385   354.882353   243.224490   267.542857   
    熊牧     540.800000   499.342105          NaN   507.000000   175.000000   
销售  李平平    110.193182    99.294118    66.526316    67.863636   206.828571   
    王松     115.014563    87.545455   145.986667   130.423077   107.434109   
    郑浪     830.000000   500.000000          NaN          NaN  2727.500000   

                金额                                          
所属区域            四川        山东        河北        河南        湖北  
部门  销售人员                                                    
办公室 郑浪    5.818182       NaN  5.500000  6.000000  5.333333  
客服  蒋波    5.470588  5.000000  5.230769  5.365854  5.416667  
    赵温江   4.916667  5.916667  6.454545  5.500000  6.000000  
财务  冯文    5.829268  5.846154  5.823529  5.734694  5.800000  
    熊牧    5.400000  5.684211       NaN  5.083333  6.000000  
销售  李平平   5.420455  5.176471  5.736842  5.363636  5.028571  
    王松    5.669903  5.672727  5.386667  5.682692  5.534884  
    郑浪    5.250000  8.000000       NaN       NaN  5.000000  

案例4:Aggfunc聚合函数或函数列表(默认情况下是mean)可以是groupby里面的任意有效函数

import pandas as pd
import numpy as np
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件028-029\透视.xlsx'
data = pd.read_excel(path)
data2 = pd.pivot_table(data,index=['部门','销售人员'],values=['数量','金额'],columns='所属区域',aggfunc=[sum,np.mean])
print(data2)

运行结果为:

              sum                                                            \
               数量                                          金额                 
所属区域           四川       山东       河北       河南       湖北      四川     山东     河北   
部门  销售人员                                                                      
办公室 郑浪    12760.0      NaN   3780.0  13980.0   1270.0    64.0    NaN   22.0   
客服  蒋波    14777.0    750.0   4736.0  32036.0  28148.0    93.0   15.0   68.0   
    赵温江   17028.0  15726.0  14577.0  11468.0  16550.0    59.0   71.0   71.0   
财务  冯文    11746.0   5000.0   6033.0  11918.0   9364.0   239.0   76.0   99.0   
    熊牧     2704.0  18975.0      NaN   6084.0    700.0    27.0  216.0    NaN   
销售  李平平    9697.0   1688.0   1264.0   2986.0   7239.0   477.0   88.0  109.0   
    王松    23693.0   4815.0  10949.0  13564.0  13859.0  1168.0  312.0  404.0   
    郑浪     3320.0    500.0      NaN      NaN  10910.0    21.0    8.0    NaN   

                               mean                                         \
                                 数量                                          
所属区域         河南     湖北           四川           山东           河北           河南   
部门  销售人员                                                                     
办公室 郑浪     66.0   48.0  1160.000000          NaN   945.000000  1270.909091   
客服  蒋波    220.0  260.0   869.235294   250.000000   364.307692   781.365854   
    赵温江    99.0   90.0  1419.000000  1310.500000  1325.181818   637.111111   
财务  冯文    281.0  203.0   286.487805   384.615385   354.882353   243.224490   
    熊牧     61.0   24.0   540.800000   499.342105          NaN   507.000000   
销售  李平平   236.0  176.0   110.193182    99.294118    66.526316    67.863636   
    王松    591.0  714.0   115.014563    87.545455   145.986667   130.423077   
    郑浪      NaN   20.0   830.000000   500.000000          NaN          NaN   

                                                                         
                             金额                                          
所属区域               湖北        四川        山东        河北        河南        湖北  
部门  销售人员                                                                 
办公室 郑浪     141.111111  5.818182       NaN  5.500000  6.000000  5.333333  
客服  蒋波     586.416667  5.470588  5.000000  5.230769  5.365854  5.416667  
    赵温江   1103.333333  4.916667  5.916667  6.454545  5.500000  6.000000  
财务  冯文     267.542857  5.829268  5.846154  5.823529  5.734694  5.800000  
    熊牧     175.000000  5.400000  5.684211       NaN  5.083333  6.000000  
销售  李平平    206.828571  5.420455  5.176471  5.736842  5.363636  5.028571  
    王松     107.434109  5.669903  5.672727  5.386667  5.682692  5.534884  
    郑浪    2727.500000  5.250000  8.000000       NaN       NaN  5.000000 

5、fill_value 在结果表中替换缺失值
例如:fill_value = 0
6、dropna 如果为True,将不含所有条目均为Na的列(默认为False)
dropna=True
7、margins 添加行/列小计和总计 (默认为False)
margins =True
不是简单地求和,而是与 aggfunc 的规则相同,为True时会添加行/列的总计.

4.1 交叉表 crosstab

交叉表: Crosstab
是透视表的一部分, aggfunc=count而已
pd.crosstab(data.Nationality, data.Handedness, margins=True)

例如:根据日期中的月份和所属区域,对部门进行统计(计数)

import pandas as pd
import numpy as np
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件028-029\透视.xlsx'
data = pd.read_excel(path)
data2 = pd.crosstab([data.日期.dt.month,data.所属区域],data.部门,margins=True)
print(data)

运行结果为:

             日期  部门 销售人员 所属区域    数量  金额  成本
0    2019-01-01  销售  李平平   湖北    16   7   8
1    2019-01-02  销售  李平平   湖北    40   8   3
2    2019-01-03  销售  李平平   湖北    20   6   7
3    2019-01-04  销售  李平平   湖北    20   7   5
4    2019-01-05  销售  李平平   湖北    16   6   6
...         ...  ..  ...  ...   ...  ..  ..
1215 2022-04-30  财务   熊牧   山东   250   4   8
1216 2022-05-01  客服  赵温江   山东  2200   4   8
1217 2022-05-02  客服  赵温江   山东  1400   3   3
1218 2022-05-03  客服  赵温江   四川  3500   7   3
1219 2022-05-04  客服  赵温江   四川  2200   4   4

[1220 rows x 7 columns]

五. 数据处理三板斧——map、apply、applymap

5.1 map

不管是利用字典还是函数进行映射,都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值

案例:

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件030-031\数据.xlsx'
data = pd.read_excel(path)
# 方法1:使用字典进行映射
data['性别'] = data['性别'].map({'男':'先生','女':'女士'})
# 方法2:使用函数
def 替换(x):
    称呼 = '先生' if x == "男" else '女士'
    return 称呼
data['性别'] = data['性别'].map(替换)
print(data)

运行结果为:

    姓名  性别  语文   数学  英语   身高  体重
0  落空空  女士  90  100   0  178  72
1  丁智敏  女士  62   82  37  160  83
2  李平平  女士  68   53  26  161  59
3   张伊  女士  66   50  35  165  61
4   王松  女士  78   65  29  176  68
5  卢海军  女士  75   68  31  173  66
6   王刚  女士  77   75  36  175  85
7  张荣耀  女士  76   81  33  170  87
8  马志理  女士  72   82  35  169  84

5.2 apply

  1. DataFrame数据处理
    行标签是0轴,列标签是1轴,axis=0 就是沿0轴,axis=1就是沿1轴
import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件030-031\数据.xlsx'
data = pd.read_excel(path)
data2 = data[['语文','数学','英语']].apply(sum,axis=0)
print(data2)

运行结果为:

语文    664
数学    656
英语    262
dtype: int64

体重BMI=体重/身高的平方(国际单位kg/㎡)

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件030-031\数据.xlsx'
data = pd.read_excel(path)
def BMI(data):
    height = data['身高']
    weight = data['体重']
    BMI = weight/(height/100) **2
    return BMI
data['BMI'] = data.apply(BMI,axis=1)
print(data)

运行结果为:

    姓名 性别  语文   数学  英语   身高  体重        BMI
0  落空空  男  90  100   0  178  72  22.724403
1  丁智敏  女  62   82  37  160  83  32.421875
2  李平平  女  68   53  26  161  59  22.761468
3   张伊  女  66   50  35  165  61  22.405877
4   王松  男  78   65  29  176  68  21.952479
5  卢海军  男  75   68  31  173  66  22.052190
6   王刚  男  77   75  36  175  85  27.755102
7  张荣耀  男  76   81  33  170  87  30.103806
8  马志理  男  72   82  35  169  84  29.410735

六. Pandas中的行列转换

先看一下数据:
在这里插入图片描述

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件030-031\转换.xlsx'
data = pd.read_excel(path)
data2 = pd.DataFrame(data.values.T,index=data.columns,columns=data.index)
print(data2)

运行结果为:

      0    1    2   3   4   5    6
姓名  丁智敏  李平平  卢海军  王松  王刚  张伊  张荣耀
性别    女    女    男   男   男   女    男
语文   50   73   76  54  78  60   64
数学   70   78   53  67  74  63   63
英语   53   53   80  67  60  55   61

七. 环比

环比:(本期 - 临近一期)/ 临近一期

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件030-031\环比.xlsx'
data = pd.read_excel(path)
month = data.金额.shift()
tongbi = month - data.金额
data['同比'] = tongbi
print(data)

运行结果为:

    城市  月份  金额    同比
0   北京   1  21   NaN
1   北京   2  20   1.0
2   北京   3  23  -3.0
3   北京   4  17   6.0
4   北京   5  30 -13.0
5   北京   6  21   9.0
6   北京   7  19   2.0
7   北京   8  19   0.0
8   北京   9  24  -5.0
9   北京  10  29  -5.0
10  北京  11  29   0.0
11  北京  12  24   5.0
12  上海   1  22   2.0
13  上海   2  14   8.0
14  上海   3  20  -6.0
15  上海   4  21  -1.0
16  上海   5  30  -9.0
17  上海   6  19  11.0
18  上海   7  19   0.0
19  上海   8  22  -3.0
20  上海   9  22   0.0
21  上海  10  28  -6.0
22  上海  11  22   6.0
23  上海  12  29  -7.0

案例2:
按城市分组
保证每个城市内的数据是按月份排序

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件030-031\环比.xlsx'
data = pd.read_excel(path,'Sheet2')
def 公式(new_data):
    new_data['环比'] = new_data.金额.shift() - new_data.金额
    return new_data
data2 = data.sort_values(['城市','月份']).groupby('城市').apply(公式)
print(data2)

运行结果为:

    城市  月份  金额    环比
12  上海   1  22   NaN
13  上海   2  14   8.0
14  上海   3  20  -6.0
15  上海   4  21  -1.0
16  上海   5  30  -9.0
17  上海   6  19  11.0
18  上海   7  19   0.0
19  上海   8  22  -3.0
20  上海   9  22   0.0
21  上海  10  28  -6.0
22  上海  11  22   6.0
23  上海  12  29  -7.0
0   北京   1  21   NaN
1   北京   2  20   1.0
2   北京   3  23  -3.0
3   北京   4  17   6.0
4   北京   5  30 -13.0
5   北京   6  21   9.0
6   北京   7  19   2.0
7   北京   8  19   0.0
8   北京   9  24  -5.0
9   北京  10  29  -5.0
10  北京  11  29   0.0
11  北京  12  24   5.0

八. pandas中的同比

=同比 = (本期 - 同期)/ 同期==
先看一下数据:
在这里插入图片描述

import pandas as pd
path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件030-031\同比.xlsx'
data = pd.read_excel(path,'Sheet1')
year = data['日期'].dt.year
data2 = pd.pivot_table(data,index='店号',values='金额',columns=year,aggfunc='sum')
tongbi = (data2[2019]-data2[2018]) / data2[2018]
data2['同比'] = tongbi
print(data2)

运行结果为:

日期    2018  2019        同比
店号                        
A001  7400  7293 -0.014459
B001  9086  9163  0.008475
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值