尝试从优化的groupby方法中获取所需的DataFrame

时间:2015-01-26 03:18:07

标签: python pandas group-by ipython dataframe

我正在尝试通过调用df.groupby('index_column').max()df.groupby('index_column').min()从这个更大的DataFrame中创建更小的DataFrame,其中index_column是我想要的df列成为新的Min和Max DataFrames的索引。在这些Min和Max DataFrame中,我希望只有2个简单列,一个索引列,另一个列分别只包含Max和Min值。

将上述所有内容放在上下文中,我将使用我所做的例子:

主要DataFrame df在标准输出中如下所示:

In [3]: df
Out[3]: 
         name                                          parameter  cycles  \
0       dfmul  [["scheduler_type", "sdc"], ["max_chain_delay"...     159   
1       dfdiv  [["scheduler_type", "sdc"], ["max_chain_delay"...    1335   
2       mpeg2  [["scheduler_type", "sdc"], ["max_chain_delay"...    1992   
3         aes  [["scheduler_type", "sdc"], ["max_chain_delay"...   5441   
4        mips  [["scheduler_type", "sdc"], ["max_chain_delay"...    4263   
5       dfadd  [["scheduler_type", "sdc"], ["max_chain_delay"...     455   
6       dfsin  [["scheduler_type", "sdc"], ["max_chain_delay"...   39589      
..        ...                                                ...     ...    
403     adpcm  [["scheduler_type", "sdc"], ["max_chain_delay"...   23355   
404     dfadd  [["scheduler_type", "sdc"], ["max_chain_delay"...     599   
405       sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   
406  blowfish  [["scheduler_type", "sdc"], ["max_chain_delay"...  251877   
407      jpeg  [["scheduler_type", "sdc"], ["max_chain_delay"...  766742   

    mem_cycles  build_number  
0         None          1300  
1         None          1300  
2         None          1300  
3         None          1300  
4         None          1300  
..         ...           ...  
401       None          1344  
402       None          1344  
403       None          1344  
404       None          1344  
405       None          1344  
406       None          1344  
407       None          1344  

[408 rows x 5 columns]

In [4]: 

当我在max()之后调用min()groupby('build_number')方法时,我会得到以下数据框,这些数据框包含df中显示的相同列,如下所示:< / p>

In [5]: df.groupby('build_number').max()
Out[5]: 
             name                                          parameter  cycles  \
build_number                                                                   
1300          sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   
1301          sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   
1302          sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   

# And it continues so on, won't list the whole frame

              mem_cycles  
build_number              
1300                 NaN  
1301                 NaN  
1302                 NaN  
# And it continues so on, won't list the whole frame

In [6]: 

当我min()时,情况也是如此。

但是,我想要的只是一个只有build_number作为索引列的DataFrame,而cycles只是非索引列。实际上,如果我改为调用mean() groupby方法,那么这种所需的输出格式就是我所获得的。

In [6]: df.groupby('build_number').mean()
Out[6]: 
                     cycles
build_number               
1300           42966.500000
1301           42992.000000
1302           42989.900000
1303           42985.300000

# And it continues so on, won't list the whole frame

In [7]: 

所以我的问题是:

  1. 当我致电mean()min()时,如何让我的输出成为我想要的输出(调用max()时的格式?)? / p>

  2. 为什么当我致电mean()时,生成的DataFrame会删除所有其他非数字列,但min()max()不会消除其他非数字列?

  3. 非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

基本上您需要做的是过滤结果与您想要的,如下所示:

@cwharland指出

编辑,在应用 max()/ min()之前过滤周期更有效

df.groupby('build_number')['cycles'].max()

df.groupby('build_number')['cycles'].min()

使用 mean()的原因仅显示cycles列是因为 mean 没有定义来获取的平均值字符串parameters类似,均值是cycles的平均记录,而 max() min()只会返回单个记录(最大值/最小值),因此显示该记录中的所有列,是否有意义?

已更新:为了使此更清晰,每个字段中的数字值可以使用均值/最大/最小值操作执行自己的值,并相应地返回值,字符串,但只有最大值/分钟,按字典顺序排序,如'A' < 'C''Z' > 'B'等,但它不能执行mean()操作,因为它不是数字。 只有在groupby适用时,所有单个列才会返回自己的最大/最小/平均值。

作为旁注:过滤后的 max() min()结果更可能是系列 DataFrame

因此,要从结果中获取新的 DataFrame ,您只需执行以下操作:

df_max = pd.DataFrame(df.groupby('build_number')['cycles'].max())
df_min = pd.DataFrame(df.groupby('build_number')['cycles'].min())

我希望这会有所帮助。