天天看点

pandas透视表常用方法

在实际工作中,一些字段较多的数据,存储时往往以params-values的形式存储。如下所示:

test = pd.DataFrame([['a','var1',1],['a','var2',2],['b','var1',1],['b','var2',2]],columns=['id','params','values'])
test
           
pandas透视表常用方法

一个id对应多行。然而在使用数据的过程中,往往希望一个id对应一行。

下面的操作可以帮助我们迅速处理成我们需要的形式,而避免写太长的sql。

p = pd.pivot_table(test,index=['id'],columns=['params'],values=['values'],aggfunc=np.max)
p
           
pandas透视表常用方法

还需要做下处理,转换成常规的Dataframe。

我们可以看下p.columns。

pandas透视表常用方法

可以看到columns,多层级结构

p.columns.levels[1]
           

Index([‘var1’, ‘var2’], dtype=‘object’, name=‘params’)

因此我们可以对columns重命名

p.columns = list(p.columns.levels[1])
p
           
pandas透视表常用方法
p=p.reset_index()
p
           
pandas透视表常用方法

重置索引,就可以得到我们想要的。

另外,也可以用pivot_table透视表实现crosstable的功能。

test = pd.DataFrame([['a','var1',1],['a','var2',2],['b','var1',1],['b','var2',2],['b','var2',2]],columns=['id','params','values'])
test
           
pandas透视表常用方法

我们来统计每个id下,不同params下的频数。

c = pd.pivot_table(test[['id','params']],index=['id'],columns=['params'],aggfunc=len,fill_value=0,margins=True,)
c
           
pandas透视表常用方法