在实际工作中,一些字段较多的数据,存储时往往以params-values的形式存储。如下所示:
test = pd.DataFrame([['a','var1',1],['a','var2',2],['b','var1',1],['b','var2',2]],columns=['id','params','values']) test一个id对应多行。然而在使用数据的过程中,往往希望一个id对应一行。
下面的操作可以帮助我们迅速处理成我们需要的形式,而避免写太长的sql。
p = pd.pivot_table(test,index=['id'],columns=['params'],values=['values'],aggfunc=np.max) p还需要做下处理,转换成常规的Dataframe。 我们可以看下p.columns。 可以看到columns,多层级结构
p.columns.levels[1]Index([‘var1’, ‘var2’], dtype=‘object’, name=‘params’)
因此我们可以对columns重命名
p.columns = list(p.columns.levels[1]) p p=p.reset_index() p重置索引,就可以得到我们想要的。
另外,也可以用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我们来统计每个id下,不同params下的频数。
c = pd.pivot_table(test[['id','params']],index=['id'],columns=['params'],aggfunc=len,fill_value=0,margins=True,) c