2015-08-13 45 views
0

我有一个大的DataFrame沿着下面的一行,我正在计算特定列的平均值或模式。我正在寻找一组功能(无论是开还是关)以及一个ID列(1或2)。大熊猫的意思和模式DataFrame中的特定列

MY_DF 

     Feature ID ITEM1 ITEM2 ITEM3 
index 
1  ON  1 2.3  544  32.2 
2  OFF  1 2.55 544  23.4 
3  ON  2 8.32 674  15.5 
4  ON  1 1.56 544  43.4 
5  OFF  2 3.55 674  32.4 

我能够做到这两项任务分别找到平均值和特定列模式,但我不能工作,如何在两个输出连接在一起,但后来我也想知道如果有一种方法计算一击中选定列的平均值或模式?

在我目前的方法中,虽然我能够单独完成这两项任务,但我正努力将两个输出结合在一起。

这是我独立的方法

#as mode is not an official function in Pandas, set out method here 
from scipy.stats.mstats import mode 
f = lambda x: mode(x, axis=None)[0] 

means = MY_DF.groupby(['Feature','ID'])[ITEM1,ITEM3].mean() 
moder = MY_DF.groupby(['Feature','ID'])[ITEM2].apply(f) 

我平均法的输出是这样的:

 ITEM1 ITEM3 
ON 1 1.93 37.8 
    2 8.32 15.5 
OFF 1 2.55 23.4 
    2 3.55 32.4 

我的方式方法输出是这样的:

 ITEM2 
ON 1 [544] 
    2 [674] 
OFF 1 [544] 
    2 [674] 

进出口寻找最后的如果可能的话输出这样的东西?

 ITEM1 ITEM3 ITEM2 
ON 1 1.93 37.8 544 
    2 8.32 15.5 674 
OFF 1 2.55 23.4 544 
    2 3.55 32.4 674 

回答

2

您可以pass a dict to GroupBy.agg。这些键指的是DataFrame的列,值指定了聚合函数。例如,

import pandas as pd 
import scipy.stats.mstats as mstats 
def mode(x): 
    return mstats.mode(x, axis=None)[0] 

df = pd.DataFrame({'Feature': ['ON', 'OFF', 'ON', 'ON', 'OFF'], 
        'ID': [1, 1, 2, 1, 2], 
        'ITEM1': [2.3, 2.55, 8.32, 1.56, 3.55], 
        'ITEM2': [544, 544, 674, 544, 674], 
        'ITEM3': [32.2, 23.4, 15.5, 43.4, 32.4],}) 

df.groupby(['Feature','ID']).agg({'ITEM1':'mean','ITEM3':'mean','ITEM2':mode}) 
print(df) 

产生

Feature ID ITEM1 ITEM2 ITEM3 
0  ON 1 2.30 544 32.2 
1  OFF 1 2.55 544 23.4 
2  ON 2 8.32 674 15.5 
3  ON 1 1.56 544 43.4 
4  OFF 2 3.55 674 32.4 
+0

好极了,感谢unutbu,这个完美的作品。我有一个其他问题是如何确保输出中的任何平均值限于2位小数? – MikG

+0

您可以使用'pd.options.display.float_format ='{:.2f}'.format'来控制在打印DataFrame时如何显示浮动*。如果您只需要控制某些列的显示,请参阅http://stackoverflow.com/a/23922119/190597 – unutbu