2016-03-01 164 views
0

我想创建一个数据透视表并用于多个aggfuncs;特别是np.meannp.stdpandas.pivot_tables的正常行为应该是将aggfuncs置于顶层。如果您只有value中的一列,这并不重要,但我有7个。这使得阅读表格有点繁琐。我希望能够将值放在层次结构的顶部,以便每个value中都有一个平均值和标准列。有没有办法可以做到这一点,或者我可以解决吗?大熊猫数据透视表排列

感谢您的帮助!

编辑:这里是一小段数据摘录。

Col1 Col2 Col3 Col4  Col5  Col6 Col7 Col8 Col9  
A  A  0  4247  5684  2068 393 237 16286 
A  A  0  0  2366  4159 3155 696 341  
A  B  18198 0  1114 1871 5392 1954 755 
A  B  17829 0  2695  2366 3768 1289 445 
A  C  18352 0  3545  7508 5099 2071 1239 

我所要的输出是这样的:

    Col 3  Col 4  Col 5  Col 6  Col 7 ... 
Col 1 Col 2 Mean Std Mean Std Mean Std Mean Std Mean Std ... 
A  A  0  0  2123.5 2173.5 ... 
     B  ... 
     C  ... 

我不打算通过所有Calcs(计算),现在运行,但我认为,跨越,因为这是一个格式化问题得到点。

+0

你可以做的是使用GROUPBY功能。这返回一个字典。然后使用字典的自定义打印方法。你可以.mean()和.std()方法。请显示数据和所需的布局。 – Merlin

+0

@merlin我添加了一些数据和所需的布局 – Grr

+0

@Merlin刚回来审查它。确实如此。应该阅读groupby文档中的所有内容。谢谢! – Grr

回答

1

我不得不从“西1” >>“Col1中”更改行标题

import pandas as pd 

df=pd.read_clipboard() 

df 

Col1 Col2 Col3 Col4  Col5  Col6 Col7 Col8 Col9  
A  A  0  4247  5684  2068 393 237 16286 
A  A  0  0  2366  4159 3155 696 341  
A  B  18198 0  1114 1871 5392 1954 755 
A  B  17829 0  2695  2366 3768 1289 445 
A  C  18352 0  3545  7508 5099 2071 1239 




    In [9]: import numpy as np 

In [10]: np.round(df.groupby(['Col1', 'Col2']).agg(['mean', 'std']),4) 
Out[10]: 
       Col3    Col4    Col5    Col6 \ 
       mean  std mean  std mean  std mean 
Col1 Col2 
A A   0.0 0.0000 2123.5 3003.0825 4025.0 2346.1803 3113.5 
    B  18013.5 260.9224  0.0  0.0000 1904.5 1117.9358 2118.5 
    C  18352.0  NaN  0.0  NaN 3545.0  NaN 7508.0 

         Col7    Col8    Col9 
       std mean  std mean  std mean   std 
Col1 Col2 
A A  1478.5603 1774 1953.0289 466.5 324.562 8313.5 11274.8176 
    B  350.0179 4580 1148.3414 1621.5 470.226 600.0 219.2031 
    C   NaN 5099  NaN 2071.0  NaN 1239.0   NaN 
0

我认为这可以使用.describe()(它既有mean也有std stats)和.pivot的组合来解决。假设你有一个DF,看起来像这样:

print(df) 

     City   Country     lon 
0  Dubai   United Arab Emirates 55.307484 
254  Buenos Aires Argentina    -58.381592 
1002 Rosario  Argentina    -60.666500 
1162 Punta Arenas Chile     -70.916473 
1178 San Miguel Argentina    -65.217590 

和你想对每个国家的“经度”列的统计信息。使用.describe获得统计数据:

stats = df.groupby('Country').describe() 
#reset index so that you can specify the columns later 
stats.reset_index(level = [0,1], inplace = True) 
stats.head() 
    Country level_1 lon 
0 Albania count 1.0000 
1 Albania mean 19.8318 
2 Albania std  NaN 
3 Albania min  19.8318 
4 Albania 25%  19.8318 

然后根据您的统计表做一个数据透视表。因为其结果将是多索引,你需要指定的元组列访问均值和std列:

stats.pivot('Country', 'level_1')[[('lon', 'mean'), ('lon', 'std')]] 

结果会是这样的:

lon 
level_1 mean std 
Country  
Albania 19.831800 NaN 
Algeria 2.744837 3.323134 
Angola 13.234444 NaN 
Argentina -63.806806 4.101027 

让我知道,如果这有助于 - 祝你好运。

+0

我在使用我的格式时遇到了一些麻烦。当脚本进入'stats.pivot'时。在我的情况下,stats.head()没有标签的统计描述符列,它只是空白。所以我不知道如何在stats.pivot(index,columns)的'columns ='键中调用它。 – Grr

+0

这就是'reset_index'行的用途。基本上,当您运行.describe()函数时,它将stats列设置为索引。因此,如果您的确如我的示例中所述,.reset_index(level = [0,1],inplace = True),那么如果您的标记比我的原始DF更多/更少,它可能不起作用。我有两个标记(国家和统计专栏),因此这两个元素都是精髓。所以试着玩弄你放入关卡参数的数字。 – Sam

+0

我试着用stats.reset_index函数实现这一点,但现在我得到一个ValueError:长度不匹配。我想要的代码是'stats。(col'1,'col 2'],'level_2')[column_tuples]'column_tuples是(col名,mean),(col名,std)元组的列表 – Grr