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

被折叠的 条评论
为什么被折叠?



