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)
运行结果为:
1月 2月 3月 4月
店号
105店 1 84 95 37
1店 1 77 76 29
225店 1 77 76 28
25店 1 80 44 28
2店 1 84 95 75
35店 1 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())
运行结果为:
一季度 二季度
店号
1店 178 29
2店 228 75
25店 181 28
35店 166 37
105店 236 37
225店 210 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)
运行结果为:
1月 2月 3月 4月
2 北京 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 51
卢 40 56 39
张 130 99 76
李 136 149 134
王 173 197 145
============================================================
语文 数学 英语
姓名 姓名
丁 智 34 54 51
卢 海 40 56 39
张 伊 65 32 40
荣 65 67 36
李 平 48 68 41
永 53 43 42
超 35 38 51
王 刚 50 70 37
松 55 59 39
硕 68 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
============================================================
数学 语文 英语
班级
1班 164 152 129
2班 88 105 79
3班 165 138 131
4班 138 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
- 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