利用pandas的stack和unstack对分组后的统计数据再执行统计

Pandas二次统计实践
本文通过实例演示了如何使用Pandas库的stack和unstack函数进行二次统计,以计算病患医保金额的时间波动性,包括分组统计和进一步的波动程度分析。

引言

利用pandas的stack和unstack可以灵活实现二次统计。

考虑一个具体的应用场景

假如我们要对病人的医保金额进行反欺诈,首先希望计算每个患者的时间维度上的波动程度。我们可以这么做:

1. 对每个病人分组,统计每个月的总费用、平均费用、费用方差。

2. 再对每个病人统计12个月的[总费用、平均费用、费用方差]的波动程度。

逻辑

先分组求某些变量的mean, sum, std这些统计指标,并再求分组变量的std。

代码

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
data1=DataFrame(np.arange(6).reshape((2,3)),index=pd.Index(['street1','street2']),columns=pd.Index(['x','two','three']))
data2=DataFrame(np.arange(6).reshape((2,3)),index=pd.Index(['street3','street4']),columns=pd.Index(['x','two','three']))
data = pd.concat([data1, data2], axis=0)
print('原始数据:\n', '-'*20, '\n', data, '\n')

df = data.groupby(['x'])['two', 'three'].agg([np.mean, np.sum, np.std])
print('groupby后:\n', '-'*20, '\n', df, '\n')

print('***接下来要统计x每一组的[mean, sum, std]的std, 仅以mean为例***')

print('1) stack(level=0):\n', '-'*20, '\n', df.stack(level=0), '\n')

print('2) stack(level=0)[mean].unstack(level=1)后:\n', '-'*20, '\n', df.stack(level=0)['mean'].unstack(level=1), '\n')

print('3) stack(level=0)[mean].unstack(level=1).std(axis=1)后:\n', '-'*20, '\n', df.stack(level=0)['mean'].unstack(level=1).std(axis=1), '\n')

 

结果

原始数据:
 -------------------- 
          x  two  three
street1  0    1      2
street2  3    4      5
street3  0    1      2
street4  3    4      5 

groupby后:
 -------------------- 
    two          three         
  mean sum  std  mean sum  std
x                             
0    1   2  0.0     2   4  0.0
3    4   8  0.0     5  10  0.0 

***接下来要统计x每一组的[mean, sum, std]的std, 仅以mean为例***

1) stack(level=0):
 -------------------- 
          mean  std  sum
x                      
0 three     2  0.0    4
  two       1  0.0    2
3 three     5  0.0   10
  two       4  0.0    8 

2) stack(level=0)[mean].unstack(level=1)后:
 -------------------- 
    three  two
x            
0      2    1
3      5    4 

3) stack(level=0)[mean].unstack(level=1).std(axis=1)后:
 -------------------- 
 x
0    0.707107
3    0.707107
dtype: float64 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值