describe函数
"""
describe()
count 该列的非NaN的个数
mean 平均值
std 标准差
min 最小值
25% 1/4分位数
50% 2/4分位数
75% 3/4分位数
max 最大值
其他
count 统计个数
sum 求和
mean 求平均值
mad 求平均绝对方差
median 求中位数
min 最小值
max 最大值
argmin 最小值的索引位置
argmax 最大值的索引位置
idxmin 最小值的行索引
idxmax 最大值的行索引
mode 众数
abs 绝对值
prod 乘积
"""
path = r"C:\work\python\pandas_files\数据统计.xlsx"
data = pd.read_excel(path)
print(data)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
1 2 李四 女 60 71 98
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
# 显示整个表的数值列的描述统计信息
b = data.describe()
print(b)
output
序号 语文 数学 英语
count 6.000000 6.000000 6.000000 6.000000
mean 3.500000 73.333333 72.833333 89.666667
std 1.870829 11.639015 14.302680 11.290114
min 1.000000 60.000000 60.000000 68.000000
25% 2.250000 64.750000 63.000000 88.750000
50% 3.500000 71.500000 67.000000 93.500000
75% 4.750000 82.000000 80.750000 96.750000
max 6.000000 89.000000 96.000000 98.000000
# 显示语文的描述统计信息
b = data['语文'].describe()
print(b)
output
count 6.000000
mean 73.333333
std 11.639015
min 60.000000
25% 64.750000
50% 71.500000
75% 82.000000
max 89.000000
Name: 语文, dtype: float64
# 求语文的最高分
b = data['语文'].max()
print(b)
output
89
# 每一列的最大值
b = data.max(numeric_only=True)
print(b)
output
序号 6
语文 89
数学 96
英语 98
dtype: int64
# 设置索引列
data.set_index('姓名', inplace=True)
print(data)
output
序号 性别 语文 数学 英语
姓名
张三 1 男 89 60 88
李四 2 女 60 71 98
王五 3 男 73 84 68
小孙 4 男 85 96 96
小刘 5 女 70 63 97
小赵 6 女 63 63 91
# 最大值索引位置
b = data['语文'].argmax()
print(b)
output
0
# 最大值行索引
c = data['语文'].idxmax()
print(c)
output
张三
分组
path = r"C:\work\python\pandas_files\分组.xlsx"
data = pd.read_excel(path)
print(data)
output
学号 时间 姓名 班级 性别 数学 语文 英语
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
# 按照索引的奇数行和偶数行分组
# 求平均值
b = data.\
groupby(data.index % 2 == 0)[['数学', '语文', '英语']].\
mean()
print(b)
output
数学 语文 英语
False 65.8 54.2 44.4
True 45.2 48.4 44.6
# 按照索引平分成两组,求各科成绩的总和
# 得到总记录数//2
z = len(data)//2
b = data.groupby(data.index > z)[['数学', '语文', '英语']].sum()
print(b)
output
数学 语文 英语
False 339 292 247
True 216 221 198
# 按照 姓 进行分组
x = data['姓名'].str[0]
b = data.groupby(x)[['数学', '语文', '英语']].mean()
print(b)
output
数学 语文 英语
姓名
丁 54.000000 34.000000 51.000000
卢 56.000000 40.000000 39.000000
张 49.500000 65.000000 38.000000
李 49.666667 45.333333 44.666667
王 65.666667 57.666667 48.333333
# 按照 姓 和 名 进行分组
x = data['姓名'].str[0]
x1 = data['姓名'].str[1:]
b = data.groupby([x, x1])[['数学', '语文', '英语']].mean()
print(b)
output
数学 语文 英语
姓名 姓名
丁 智敏 54.0 34.0 51.0
卢 海军 56.0 40.0 39.0
张 伊 32.0 65.0 40.0
荣耀 67.0 65.0 36.0
李 平平 68.0 48.0 41.0
永兴 43.0 53.0 42.0
超 38.0 35.0 51.0
王 刚 70.0 50.0 37.0
松 59.0 55.0 39.0
硕 68.0 68.0 69.0
# 按照班级分组
b = data.groupby("班级")[['数学', '语文', '英语']].mean()
print(b)
output
数学 语文 英语
班级
1班 54.666667 50.666667 43.000000
2班 44.000000 52.500000 39.500000
3班 55.000000 46.000000 43.666667
4班 69.000000 59.000000 53.000000
# 按照1班2班分组
tj = (data.班级 == '1班') | (data.班级 == '2班')
b = data.groupby(tj)[['数学', '语文', '英语']].mean()
print(b)
output
数学 语文 英语
班级
False 60.6 51.2 47.4
True 50.4 51.4 41.6
# 使用 isin 函数完成
b = data.groupby(data.班级.isin(['1班', '2班']))[['数学', '语文', '英语']].mean()
print(b)
output
数学 语文 英语
班级
False 60.6 51.2 47.4
True 50.4 51.4 41.6
# 按照年进行分组
b = data.groupby(data.时间.dt.year)[['数学', '语文', '英语']].mean()
print(b)
output
数学 语文 英语
时间
2020 55.5 51.3 44.5
# 年 和 月 进行分组
b = data.groupby([data.时间.dt.year, data.时间.dt.month])[['数学', '语文', '英语']].sum()
print(b)
output
数学 语文 英语
时间 时间
2020 5 555 513 445
# 按照时间进行分组
b = data.groupby(data.时间.dt.hour)[['数学', '语文', '英语']].sum()
print(b)
# data.时间.dt.year
# data.时间.dt.month
# data.时间.dt.day
# data.时间.dt.hour
# data.时间.dt.minute
# data.时间.dt.second
output
数学 语文 英语
时间
8 113 103 79
9 100 133 109
17 151 124 141
18 191 153 116
数据透视表
path = r"C:\work\python\pandas_files\透视.xlsx"
data = pd.read_excel(path)
print(data)
output
日期 部门 销售人员 所属区域 数量 金额 成本
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]
# 按照部门的销售人员进行分组,对数量,金额,成本,求平均值(默认)
piv = pd.pivot_table(data, index=['部门', '销售人员'], values=['数量', '金额', '成本'])
print(piv)
output
成本 数量 金额
部门 销售人员
办公室 郑浪 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
# 按照部门的销售人员进行分组,地区作为列显示,对'数量','金额','成本',求平均值(默认)
piv = pd.pivot_table(data
,index=['部门', '销售人员'] # excel数据透视表中的行
,values=['数量', '金额', '成本'] # excel数据透视表中的值
,columns=['所属区域']) # excel数据透视表中的列
print(piv)
output
成本 数量 \
所属区域 四川 山东 河北 河南 湖北 四川
部门 销售人员
办公室 郑浪 5.090909 NaN 6.500000 5.454545 6.222222 1160.000000
客服 蒋波 6.352941 5.000000 5.923077 5.121951 5.437500 869.235294
赵温江 5.166667 6.000000 5.545455 4.888889 5.066667 1419.000000
财务 冯文 5.609756 5.692308 5.176471 5.285714 5.714286 286.487805
熊牧 6.200000 5.368421 NaN 5.833333 4.750000 540.800000
销售 李平平 5.340909 5.470588 5.263158 5.750000 5.571429 110.193182
王松 5.631068 5.127273 5.360000 5.355769 5.403101 115.014563
郑浪 4.750000 6.000000 NaN NaN 4.500000 830.000000
金额 \
所属区域 山东 河北 河南 湖北 四川
部门 销售人员
办公室 郑浪 NaN 945.000000 1270.909091 141.111111 5.818182
客服 蒋波 250.000000 364.307692 781.365854 586.416667 5.470588
赵温江 1310.500000 1325.181818 637.111111 1103.333333 4.916667
财务 冯文 384.615385 354.882353 243.224490 267.542857 5.829268
熊牧 499.342105 NaN 507.000000 175.000000 5.400000
销售 李平平 99.294118 66.526316 67.863636 206.828571 5.420455
王松 87.545455 145.986667 130.423077 107.434109 5.669903
郑浪 500.000000 NaN NaN 2727.500000 5.250000
...
熊牧 5.684211 NaN 5.083333 6.000000
销售 李平平 5.176471 5.736842 5.363636 5.028571
王松 5.672727 5.386667 5.682692 5.534884
郑浪 8.000000 NaN NaN 5.000000
# 按照部门的销售人员进行分组,对'数量','金额','成本',求和
piv = pd.pivot_table(data
,index=['部门', '销售人员'] # excel数据透视表中的行
,values=['数量', '金额', '成本'] # excel数据透视表中的值
,aggfunc='sum') # excel数据透视表中的列
print(piv)
output
成本 数量 金额
部门 销售人员
办公室 郑浪 198 31790 200
客服 蒋波 671 80447 656
赵温江 359 75349 390
财务 冯文 851 44061 898
熊牧 324 28463 328
销售 李平平 1111 22874 1086
王松 3098 66880 3189
郑浪 43 14730 49
# 按照部门的销售人员进行分组,对'数量','金额','成本',
# 对所有的数据进行 求和,平均,计数
piv = pd.pivot_table(data
,index=['部门', '销售人员'] # excel数据透视表中的行
,values=['数量', '金额', '成本'] # excel数据透视表中的值
,aggfunc=['sum', 'mean', 'count']) # excel数据透视表中的列
print(piv)
output
sum mean count
成本 数量 金额 成本 数量 金额 成本 数量 金额
部门 销售人员
办公室 郑浪 198 31790 200 5.657143 908.285714 5.714286 35 35 35
客服 蒋波 671 80447 656 5.500000 659.401639 5.377049 122 122 122
赵温江 359 75349 390 5.279412 1108.073529 5.735294 68 68 68
财务 冯文 851 44061 898 5.490323 284.264516 5.793548 155 155 155
熊牧 324 28463 328 5.491525 482.423729 5.559322 59 59 59
销售 李平平 1111 22874 1086 5.472906 112.679803 5.349754 203 203 203
王松 3098 66880 3189 5.444640 117.539543 5.604569 569 569 569
郑浪 43 14730 49 4.777778 1636.666667 5.444444 9 9 9
# 按照部门的销售人员进行分组,对'数量','金额','成本',
# 数量计数、金额求平均、对成本求和
piv = pd.pivot_table(data
,index=['部门', '销售人员'] # excel数据透视表中的行
,values=['数量', '金额', '成本'] # excel数据透视表中的值
,aggfunc={
"数量": 'count',
"金额": 'mean',
'成本': 'sum'
})
print(piv)
output
成本 数量 金额
部门 销售人员
办公室 郑浪 198 35 5.714286
客服 蒋波 671 122 5.377049
赵温江 359 68 5.735294
财务 冯文 851 155 5.793548
熊牧 324 59 5.559322
销售 李平平 1111 203 5.349754
王松 3098 569 5.604569
郑浪 43 9 5.444444
# 按照部门的销售人员进行分组,对'数量','金额','成本',
# 数量计数和平均、金额求平均和求和、对成本求和
piv = pd.pivot_table(data
,index=['部门', '销售人员'] # excel数据透视表中的行
,values=['数量', '金额', '成本'] # excel数据透视表中的值
,aggfunc={
"数量": ['count', 'mean'],
"金额": ['mean', 'sum'],
'成本': 'sum'
}
,fill_value=0)
print(piv)
output
成本 数量 金额
sum count mean mean sum
部门 销售人员
办公室 郑浪 198 35 908.285714 5.714286 200
客服 蒋波 671 122 659.401639 5.377049 656
赵温江 359 68 1108.073529 5.735294 390
财务 冯文 851 155 284.264516 5.793548 898
熊牧 324 59 482.423729 5.559322 328
销售 李平平 1111 203 112.679803 5.349754 1086
王松 3098 569 117.539543 5.604569 3189
郑浪 43 9 1636.666667 5.444444 49
piv = pd.pivot_table(data
,index=['部门', '销售人员'] # excel数据透视表中的行
,values=['数量', '金额', '成本'] # excel数据透视表中的值
,aggfunc={
"数量": ['count', 'mean'],
"金额": ['mean', 'sum'],
'成本': 'sum'
}
,columns='所属区域'
,fill_value=0)
print(piv.columns)
output
MultiIndex([('成本', 'sum', '四川'),
('成本', 'sum', '山东'),
('成本', 'sum', '河北'),
('成本', 'sum', '河南'),
('成本', 'sum', '湖北'),
('数量', 'count', '四川'),
('数量', 'count', '山东'),
('数量', 'count', '河北'),
('数量', 'count', '河南'),
('数量', 'count', '湖北'),
('数量', 'mean', '四川'),
('数量', 'mean', '山东'),
('数量', 'mean', '河北'),
('数量', 'mean', '河南'),
('数量', 'mean', '湖北'),
('金额', 'mean', '四川'),
('金额', 'mean', '山东'),
('金额', 'mean', '河北'),
('金额', 'mean', '河南'),
('金额', 'mean', '湖北'),
('金额', 'sum', '四川'),
('金额', 'sum', '山东'),
('金额', 'sum', '河北'),
('金额', 'sum', '河南'),
('金额', 'sum', '湖北')],
names=[None, None, '所属区域'])
# 取出成本列
b = piv.成本
print(b)
output
sum
所属区域 四川 山东 河北 河南 湖北
部门 销售人员
办公室 郑浪 56 0 26 60 56
客服 蒋波 108 15 77 210 261
赵温江 62 72 61 88 76
财务 冯文 230 74 88 259 200
熊牧 31 204 0 70 19
销售 李平平 470 93 100 253 195
王松 1160 282 402 557 697
郑浪 19 6 0 0 18
# 取出数量列
b = piv.数量
print(b)
output
count mean \
所属区域 四川 山东 河北 河南 湖北 四川 山东 河北
部门 销售人员
办公室 郑浪 11 0 4 11 9 1160.000000 0.000000 945.000000
客服 蒋波 17 3 13 41 48 869.235294 250.000000 364.307692
赵温江 12 12 11 18 15 1419.000000 1310.500000 1325.181818
财务 冯文 41 13 17 49 35 286.487805 384.615385 354.882353
熊牧 5 38 0 12 4 540.800000 499.342105 0.000000
销售 李平平 88 17 19 44 35 110.193182 99.294118 66.526316
王松 206 55 75 104 129 115.014563 87.545455 145.986667
郑浪 4 1 0 0 4 830.000000 500.000000 0.000000
所属区域 河南 湖北
部门 销售人员
办公室 郑浪 1270.909091 141.111111
客服 蒋波 781.365854 586.416667
赵温江 637.111111 1103.333333
财务 冯文 243.224490 267.542857
熊牧 507.000000 175.000000
销售 李平平 67.863636 206.828571
王松 130.423077 107.434109
郑浪 0.000000 2727.500000
# 取出数量中的count
b = piv[('数量', 'count')]
print(b)
output
所属区域 四川 山东 河北 河南 湖北
部门 销售人员
办公室 郑浪 11 0 4 11 9
客服 蒋波 17 3 13 41 48
赵温江 12 12 11 18 15
财务 冯文 41 13 17 49 35
熊牧 5 38 0 12 4
销售 李平平 88 17 19 44 35
王松 206 55 75 104 129
郑浪 4 1 0 0 4
# 取出数量中的count对应的四川
b = piv[('数量', 'count', '四川')]
print(b)
print(piv.index)
output
部门 销售人员
办公室 郑浪 11
客服 蒋波 17
赵温江 12
财务 冯文 41
熊牧 5
销售 李平平 88
王松 206
郑浪 4
Name: (数量, count, 四川), dtype: int64
MultiIndex([('办公室', '郑浪'),
( '客服', '蒋波'),
( '客服', '赵温江'),
( '财务', '冯文'),
( '财务', '熊牧'),
( '销售', '李平平'),
( '销售', '王松'),
( '销售', '郑浪')],
names=['部门', '销售人员'])
# 财务部门的数量中的count
# loc[行][列]
b = piv.loc['财务'][('数量', 'count')]
print(b)
output
所属区域 四川 山东 河北 河南 湖北
销售人员
冯文 41 13 17 49 35
熊牧 5 38 0 12 4
# 财务部门冯文的数量的count
b = piv.loc[('财务', '冯文')][('数量', 'count')]
print(b)
output
所属区域
四川 41.0
山东 13.0
河北 17.0
河南 49.0
湖北 35.0
Name: (财务, 冯文), dtype: float64
# 平均金额小于5的记录
tj = piv[('金额', 'mean')] < 5
b = piv[tj]
print(b)
output
成本 数量 ... 金额 \
sum count ... mean
所属区域 四川 山东 河北 河南 湖北 四川 山东 河北 河南 湖北 ... 四川
部门 销售人员 ...
办公室 郑浪 NaN 0.0 NaN NaN NaN NaN 0.0 NaN NaN NaN ... NaN
客服 蒋波 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN
赵温江 62.0 NaN NaN NaN NaN 12.0 NaN NaN NaN NaN ... 4.916667
财务 冯文 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN
熊牧 NaN NaN 0.0 NaN NaN NaN NaN 0.0 NaN NaN ... NaN
销售 李平平 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN
王松 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN
郑浪 NaN NaN 0.0 0.0 NaN NaN NaN 0.0 0.0 NaN ... NaN
sum
所属区域 山东 河北 河南 湖北 四川 山东 河北 河南 湖北
部门 销售人员
办公室 郑浪 0.0 NaN NaN NaN NaN 0.0 NaN NaN NaN
客服 蒋波 NaN NaN NaN NaN NaN NaN NaN NaN NaN
赵温江 NaN NaN NaN NaN 59.0 NaN NaN NaN NaN
财务 冯文 NaN NaN NaN NaN NaN NaN NaN NaN NaN
熊牧 NaN 0.0 NaN NaN NaN NaN 0.0 NaN NaN
销售 李平平 NaN NaN NaN NaN NaN NaN NaN NaN NaN
王松 NaN NaN NaN NaN NaN NaN NaN NaN NaN
郑浪 NaN 0.0 0.0 NaN NaN NaN 0.0 0.0 NaN
[8 rows x 25 columns]
# 四川的成本的和大于100
tj = piv[('成本', 'sum', '四川')] > 100
b = piv[tj]
print(b)
output
成本 数量 ... 金额 \
sum count ... mean
所属区域 四川 山东 河北 河南 湖北 四川 山东 河北 河南 湖北 ... 四川
部门 销售人员 ...
客服 蒋波 108 15 77 210 261 17 3 13 41 48 ... 5.470588
财务 冯文 230 74 88 259 200 41 13 17 49 35 ... 5.829268
销售 李平平 470 93 100 253 195 88 17 19 44 35 ... 5.420455
王松 1160 282 402 557 697 206 55 75 104 129 ... 5.669903
sum
所属区域 山东 河北 河南 湖北 四川 山东 河北 河南 湖北
部门 销售人员
客服 蒋波 5.000000 5.230769 5.365854 5.416667 93 15 68 220 260
财务 冯文 5.846154 5.823529 5.734694 5.800000 239 76 99 281 203
销售 李平平 5.176471 5.736842 5.363636 5.028571 477 88 109 236 176
王松 5.672727 5.386667 5.682692 5.534884 1168 312 404 591 714
[4 rows x 25 columns]
# 用query查询
print(piv[('成本', 'sum', '四川')])
output
部门 销售人员
办公室 郑浪 56
客服 蒋波 108
赵温江 62
财务 冯文 230
熊牧 31
销售 李平平 470
王松 1160
郑浪 19
Name: (成本, sum, 四川), dtype: int64
# 条件中的 ('成本', 'sum', '四川') 逗号后面 有且只能有1个空格
tj = "`('成本', 'sum', '四川')` > 100"
b = piv.query(tj)
print(b)
output
成本 数量 ... 金额 \
sum count ... mean
所属区域 四川 山东 河北 河南 湖北 四川 山东 河北 河南 湖北 ... 四川
部门 销售人员 ...
客服 蒋波 108 15 77 210 261 17 3 13 41 48 ... 5.470588
财务 冯文 230 74 88 259 200 41 13 17 49 35 ... 5.829268
销售 李平平 470 93 100 253 195 88 17 19 44 35 ... 5.420455
王松 1160 282 402 557 697 206 55 75 104 129 ... 5.669903
sum
所属区域 山东 河北 河南 湖北 四川 山东 河北 河南 湖北
部门 销售人员
客服 蒋波 5.000000 5.230769 5.365854 5.416667 93 15 68 220 260
财务 冯文 5.846154 5.823529 5.734694 5.800000 239 76 99 281 203
销售 李平平 5.176471 5.736842 5.363636 5.028571 477 88 109 236 176
王松 5.672727 5.386667 5.682692 5.534884 1168 312 404 591 714
[4 rows x 25 columns]
环比
# 环比:
# 当前周期与前一个周期进行比较
# 例如 2月和1月比较,3月和2月比较,4月和月比较
# 环比额 = 本期数据-上一期的数据
# 环比率 = (本期数据-上一期的数据)/上期的数据
path = r"C:\work\python\pandas_files\环比.xlsx"
data = pd.read_excel(path, sheet_name='Sheet1')
print(data)
output
日期 销售金额
0 1月 28
1 2月 19
2 3月 25
3 4月 27
4 5月 15
5 6月 20
6 7月 23
7 8月 29
8 9月 19
9 10月 23
10 11月 25
11 12月 11
data['上一期'] = data.销售金额.shift()
data['环比额'] = data['上一期']-data['销售金额']
data['环比率'] = (data['环比额']/data.上一期).fillna(0).apply(lambda x: '{:.2%}'.format(x))
print(data)
output
日期 销售金额 上一期 环比额 环比率
0 1月 28 NaN NaN 0.00%
1 2月 19 28.0 9.0 32.14%
2 3月 25 19.0 -6.0 -31.58%
3 4月 27 25.0 -2.0 -8.00%
4 5月 15 27.0 12.0 44.44%
5 6月 20 15.0 -5.0 -33.33%
6 7月 23 20.0 -3.0 -15.00%
7 8月 29 23.0 -6.0 -26.09%
8 9月 19 29.0 10.0 34.48%
9 10月 23 19.0 -4.0 -21.05%
10 11月 25 23.0 -2.0 -8.70%
11 12月 11 25.0 14.0 56.00%
data = pd.read_excel(path, sheet_name='Sheet2')
# 排序
data = data.sort_values(['城市', '月份'])
print(data)
def mydef(a):
b = a.金额.shift()
a['环比额'] = b-a.金额
a['环比率'] = (a.环比额/b).fillna(0).apply(lambda x: '{:.2%}'.format(x))
return a
b = data.groupby(['城市']).apply(mydef)
print(b)
output
城市 月份 金额
12 上海 1 22
13 上海 2 14
14 上海 3 20
15 上海 4 21
16 上海 5 30
17 上海 6 19
18 上海 7 19
19 上海 8 22
20 上海 9 22
21 上海 10 28
22 上海 11 22
23 上海 12 29
0 北京 1 21
1 北京 2 20
2 北京 3 23
3 北京 4 17
4 北京 5 30
5 北京 6 21
6 北京 7 19
7 北京 8 19
8 北京 9 24
9 北京 10 29
10 北京 11 29
11 北京 12 24
城市 月份 金额 环比额 环比率
城市
上海 12 上海 1 22 NaN 0.00%
13 上海 2 14 8.0 36.36%
14 上海 3 20 -6.0 -42.86%
15 上海 4 21 -1.0 -5.00%
16 上海 5 30 -9.0 -42.86%
17 上海 6 19 11.0 36.67%
18 上海 7 19 0.0 0.00%
19 上海 8 22 -3.0 -15.79%
20 上海 9 22 0.0 0.00%
21 上海 10 28 -6.0 -27.27%
22 上海 11 22 6.0 21.43%
23 上海 12 29 -7.0 -31.82%
北京 0 北京 1 21 NaN 0.00%
1 北京 2 20 1.0 4.76%
2 北京 3 23 -3.0 -15.00%
3 北京 4 17 6.0 26.09%
4 北京 5 30 -13.0 -76.47%
5 北京 6 21 9.0 30.00%
6 北京 7 19 2.0 9.52%
7 北京 8 19 0.0 0.00%
8 北京 9 24 -5.0 -26.32%
9 北京 10 29 -5.0 -20.83%
10 北京 11 29 0.0 0.00%
11 北京 12 24 5.0 17.24%
# 同比:
# 今年与去年同一个时间段的比较
path = r"C:\work\python\pandas_files\同比.xlsx"
data = pd.read_excel(path)
print(data)
output
日期 店号 金额
0 2018-01-01 A001 26
1 2018-01-02 A001 11
2 2018-01-03 A001 15
3 2018-01-04 A001 25
4 2018-01-05 A001 22
... ... ... ..
1455 2019-12-27 B001 23
1456 2019-12-28 B001 26
1457 2019-12-29 B001 29
1458 2019-12-30 B001 23
1459 2019-12-31 B001 24
[1460 rows x 3 columns]
piv = pd.pivot_table(data,
index='店号',
values='金额',
aggfunc='sum',
columns=data.日期.dt.year)
print(piv)
# 同比率
tbl = (piv[2019] - piv[2018])/piv[2018]
piv['同比率百分比'] = tbl.apply(lambda x: '{:.2%}'.format(x))
print(piv)
output
日期 2018 2019
店号
A001 7400 7293
B001 9086 9163
日期 2018 2019 同比率百分比
店号
A001 7400 7293 -1.45%
B001 9086 9163 0.85%