2015-08-13 44 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