"压扁"熊猫的group.nth输出

时间:2013-06-07 03:50:37

标签: python pandas

我的索引技能并没有达到标准,而且我正在努力解决这个问题。

我有以下设置:

import pandas as pd
import numpy as np

index = pd.bdate_range('2012-1-1', periods=250)
df1 = pd.DataFrame(np.random.rand(250,4), index=index, columns=[1, 2, 3, 4])
df2 = pd.DataFrame(np.random.rand(250,4), index=index, columns=[1, 2, 3, 4])
df = pd.concat({'A': df1, 'B': df2}, axis=1)

group = df.groupby([lambda x: x.year, lambda x: x.month])

我看到最大的没有。我的团队中的工作日(即(年,月)组合)是23:

In [257]: group.size().max()
Out[257]: 23

在每个月的第一个工作日(索引n = 0),我可以得到如下统计数据:

In [258]: group.nth(0).describe()
Out[258]: 
               A                                           B             \
               1          2          3          4          1          2   
count  12.000000  12.000000  12.000000  12.000000  12.000000  12.000000   
mean    0.541559   0.491684   0.354012   0.448284   0.353839   0.408020   
std     0.367662   0.242924   0.254447   0.248426   0.228194   0.220511   
min     0.021792   0.110715   0.067677   0.074719   0.097227   0.116947   
25%     0.144712   0.368966   0.144415   0.209418   0.189507   0.260863   
50%     0.646160   0.439860   0.233370   0.472696   0.214474   0.370281   
75%     0.865417   0.614928   0.587038   0.710450   0.529376   0.602299   
max     0.963938   0.912865   0.766722   0.750037   0.778580   0.776627   


               3          4  
count  12.000000  12.000000  
mean    0.434197   0.588980  
std     0.301113   0.287869  
min     0.004253   0.064859  
25%     0.262517   0.357484  
50%     0.350605   0.653136  
75%     0.676960   0.775588  
max     0.991661   0.990118  

我想要做的是在范围(23)中对n运行group.nth(n).describe(),并将结果保存为以下格式:

                 count      mean       std   min   25%   50%   75%   max
(col2, n, col1)    281 -0.004093  0.140578 -1.64 -0.04 -0.00  0.04  0.58

对于(col2,n,col1)的所有组合,其中col2是下栏名(1到4),n在范围(23)中,col1是上栏名(' A&#39) ;或者' B')。

非常感谢任何帮助 - 我将学习很多关于如何进行这些操作的知识。我有一些方法:

group.nth(0).describe().stack().T.stack()`

但是当我迭代n到22时,我会对它做一个哈希。

谢谢。

1 个答案:

答案 0 :(得分:1)

你非常接近。您只需要使用索引从索引生成一个显式列表,将n置于中间。然后,使用数据框列表,您可以直接使用concat

group = df.groupby([lambda x: x.year, lambda x: x.month])
dataframes = []
for n in range(23):
    frame = group.nth(n).describe().T
    frame.index = [(inner, n, outer) for outer, inner in frame.index]
    dataframes.append(frame)
final_df = pd.concat(dataframes)