展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

Pandas基本使用(六):describe函数/分组/数据透视表/环比

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%
posted @ 2023-11-22 11:52  DogLeftover  阅读(142)  评论(0编辑  收藏  举报