2015-04-17 45 views
1

我有一個數據幀格式爲:平均GROUPBY或在數據幀的平均與重複索引的GROUPBY

   value identifier 
2007-01-01 0.087085  55 
2007-01-01 0.703249  56 
2007-02-01 0.967872  55 
2007-02-01 0.954142  56 
2008-01-01 0.804404  55 
2008-01-01 0.475372  56 
2008-02-01 0.025823  55 
2008-02-01 0.414736  56 

我需要一個月做的箱線圖。還有的我怎麼做兩種方式:一是通過索引GROUPBY,複製到一個新的數據幀,並通過每月做一次GROUPBY:

by_index = dd.groupby(dd.index).mean() 
temp = pd.DataFrame() 
temp['value'] =by_index['value'] 
by_month = temp.groupby(lambda x: x.month) 
by_month.boxplot(subplots=False) 

還是第一GROUPBY一個月,直接取均值和劇情:

by_month = dd.groupby(lambda x: x.month) 
by_month_avg = by_month.mean() 
by_month_avg['value'].plot() 

問題是兩種方法之間的方法不同。什麼是正確的方法?這兩個結果應該相等嗎?

+0

不確定是什麼問題。手段是不一樣的,因爲在前一種方法中,jan2007和jan2008是不同的,但後者是相同的(因爲jan是jan,無論年份如何)。兩者都不是更正確的,只取決於你想要哪一個。 – JohnE

+0

他們在第一種情況下按月份再次分組,所以最後它們是相同的 - 完全是我的問題。 – Ivan

回答

1

我認爲這種混淆是因爲在這兩種情況下你使用的是不同的語法,不太明顯的區別是什麼。您正在使用的λ在一個情況下對指數進行操作:

dd.groupby(lambda x: x.month).mean() 

或者,你可以做這樣的(類似於你在其他情況下,做了什麼):

dd.groupby(dd.index.month).mean() 

它那麼應該清楚爲什麼上面給出了不同的答案比:

dd.groupby(dd.index).mean() 

在一種情況下,結果都是手段日期,在另一方面,他們是按月份。也許這打印轉儲還將幫助:

dd.index.date 

array([datetime.date(2007, 1, 1), datetime.date(2007, 1, 1), 
     datetime.date(2007, 2, 1), datetime.date(2007, 2, 1), 
     datetime.date(2008, 1, 1), datetime.date(2008, 1, 1), 
     datetime.date(2008, 2, 1), datetime.date(2008, 2, 1)], dtype=object) 

dd.index.month 
array([1, 1, 2, 2, 1, 1, 2, 2]) 

我剛添加的「日期」的屬性,使其打印清潔,但這個想法是不變的。前者groupby有4個組,後者有2個。

基於一個後續問題,我想知道你真正想要的是按月還是按年分組?

dd.groupby([dd.index.year,dd.index.month]).mean() 

      value identifier 
2007 1 0.395167  55.5 
    2 0.961007  55.5 
2008 1 0.639888  55.5 
    2 0.220279  55.5 
+0

dd.index.month有助於使代碼更清晰,但我會想象ddby.index的groupby會爲每一天創建一個groupby。如果每個月只有一天,結果應該是一樣的吧? – Ivan

+0

差不多。這是一組**日期**,而不是**日**,所以答案也取決於年份。也許你想要:'''dd.groupby([dd.index.year,dd.index.month])。mean()''' – JohnE

+0

看看標識符現在是55.5,沒有任何意義。 – Ivan