2017-03-17 51 views
1

我有一個數據框,其中包含多個日期和兩個值類型的最大值和最小值,當然還有值的數量或數量,它看起來像這樣。按日期對數據框進行分組

Date  Type  Quantity 
2008-01-01 Max  100 
2008-01-01 Max  105 
2008-01-01 Min  80 
2008-01-01 Min  75 
2009-01-01 Max  101 
2009-01-01 Max  106 

我想團這個數據幀(我不知道,如果分組是正確的術語),由日,月(我想要得到的最大和所有年份的最低日值),也鴻溝它有2個系列的最大值和最小值,所以最終結果將如下所示。 我已經消除了閏年的2-29這樣的日期,所以這是有道理的。

Date  Type  Quantity 
01-01  Max  106 
01-02  Max  107 
01-03  Max  104 



Date  Type  Quantity 
01-01  Min  75 
01-02  Min  72 
01-03  Min  74 

關於如何解決這個問題的任何想法?

謝謝大家!

+0

只是給你一些反饋。我很困惑,因爲它看起來你的輸入數據不符合你的輸出。我已經停止嘗試回答這個問題。其他人仍然試圖給你一個答案。希望它對你有用。但是,爲了將來的參考,你得到的答案的質量取決於問題的質量。如果您努力通過您嘗試過的數據和代碼來清楚地表明您的問題,那麼您將顯着提高獲得良好答案的機會。 – piRSquared

+0

感謝隊友,我會盡量在數據輸入和輸出方面更具體,我會改變它以使它更簡單! –

回答

2

可以使用由strftime和列Type和總maxmin通過dictsuper solution of BrenBarn創建Seriesgroupby,持續dfmaxdfminboolean indexing

print (df) 
     Date Type Quantity 
0 2008-01-01 Max  100 
1 2008-01-02 Max  105 
2 2008-01-01 Min  80 
3 2008-01-01 Min  75 
4 2009-01-02 Max  101 
5 2009-01-01 Max  106 
print (df.Date.dt.strftime('%m-%d')) 
0 01-01 
1 01-02 
2 01-01 
3 01-01 
4 01-02 
5 01-01 
Name: Date, dtype: object 

func_map = {'Min': min, 'Max': max} 
df1 = df.groupby([df.Date.dt.strftime('%m-%d'), 'Type'])['Quantity'] 
     .apply(lambda g: func_map[g.name[1]](g)) 
     .reset_index() 
print (df1) 
    Date Type Quantity 
0 01-01 Max  106 
1 01-01 Min  75 
2 01-02 Max  105 

mask = df1.Type == 'Max' 
dfmax = df1[mask] 
print (dfmax) 
    Date Type Quantity 
0 01-01 Max  106 
2 01-02 Max  105 

dfmin = df1[~mask] 
print (dfmin) 
    Date Type Quantity 
1 01-01 Min  75 
+0

感謝隊友,這真的很有幫助! –

+0

很高興能幫到你!祝你好運!如果我的回答很有幫助,請不要忘記[接受](http://meta.stackexchange.com/a/5235/295067)它。謝謝。 – jezrael