2017-09-15 146 views
1

一個GROUPBY操作我有這樣的示例表的結果:情節大熊貓

ID Date  Days Volume/Day 
0 111 2016-01-01 20 50 
1 111 2016-02-01 25 40 
2 111 2016-03-01 31 35 
3 111 2016-04-01 30 30 
4 111 2016-05-01 31 25 
5 111 2016-06-01 30 20 
6 111 2016-07-01 31 20 
7 111 2016-08-01 31 15 
8 111 2016-09-01 29 15 
9 111 2016-10-01 31 10 
10 111 2016-11-01 29 5 
11 111 2016-12-01 27 0 
0 112 2016-01-01 31 55 
1 112 2016-02-01 26 45 
2 112 2016-03-01 31 40 
3 112 2016-04-01 30 35 
4 112 2016-04-01 31 30 
5 112 2016-05-01 30 25 
6 112 2016-06-01 31 25 
7 112 2016-07-01 31 20 
8 112 2016-08-01 30 20 
9 112 2016-09-01 31 15 
10 112 2016-11-01 29 10 
11 112 2016-12-01 31 0 

我試圖讓我的表格最後的表像這樣通過ID和日期分組後下方。

ID Date  CumDays Volume/Day 
0 111 2016-01-01 20  50 
1 111 2016-02-01 45  40 
2 111 2016-03-01 76  35 
3 111 2016-04-01 106  30 
4 111 2016-05-01 137  25 
5 111 2016-06-01 167  20 
6 111 2016-07-01 198  20 
7 111 2016-08-01 229  15 
8 111 2016-09-01 258  15 
9 111 2016-10-01 289  10 
10 111 2016-11-01 318  5 
11 111 2016-12-01 345  0 
0 112 2016-01-01 31  55 
1 112 2016-02-01 57  45 
2 112 2016-03-01 88  40 
3 112 2016-04-01 118  35 
4 112 2016-05-01 149  30 
5 112 2016-06-01 179  25 
6 112 2016-07-01 210  25 
7 112 2016-08-01 241  20 
8 112 2016-09-01 271  20 
9 112 2016-10-01 302  15 
10 112 2016-11-01 331  10 
11 112 2016-12-01 362  0 

接着,我希望能夠以提取音量/每ID天,所有的CumDays值和每個ID和日期的所有容積/日的值的第一個值。因此,我可以將它們用於進一步計算並繪製Volume/Day vs CumDays。 ID爲111的例子,Volume/Day的第一個值將只有50,ID:112,它將只有55. ID:111的所有CumDays值將是20,45 ...和ID:112,它會是31,57 ...對於所有批量/天--- ID:111,將在50,40 ...和ID:112將55,45 ...

我的解決辦法:

def get_time_rate(grp_df): 
    t = grp_df['Days'].cumsum() 
    r = grp_df['Volume/Day'] 
    return t,r 

vals = df.groupby(['ID','Date']).apply(get_time_rate) 
vals 

這樣做,累計計算根本不起作用。它返回原始的Days值。這不允許我進一步提取Volume/Day的第一個值,所有CumDays值和我需要的所有Volume/Day值。任何意見或幫助如何去解決它將不勝感激。謝謝

+0

你爲什麼要張貼HTML嗎?這是你如何接收你的數據? – piRSquared

+0

@piRSquared,no。這是我組織它,所以它可以在S.O.上看到。有沒有其他更好的方法來顯示S.O的表格,除了用html形式表示它或拍攝它的照片? – dlvr

+0

我們所看到的只是原始HTML,除非我們點擊運行代碼片段。請粘貼數據文本並突出顯示該文本,然後單擊與{{}}相似的按鈕。這將使每行縮進四個空格。反過來以便利的方式呈現您的餐桌,以便我們幫助您 – piRSquared

回答

2

獲取groupby對象。

g = df.groupby('ID') 

計算列與transform

df['CumDays'] = g.Days.transform('cumsum') 
df['First Volume/Day'] = g['Volume/Day'].transform('first') 
df 

    ID  Date Days Volume/Day CumDays First Volume/Day 
0 111 2016-01-01 20   50  20    50 
1 111 2016-02-01 25   40  45    50 
2 111 2016-03-01 31   35  76    50 
3 111 2016-04-01 30   30  106    50 
4 111 2016-05-01 31   25  137    50 
5 111 2016-06-01 30   20  167    50 
6 111 2016-07-01 31   20  198    50 
7 111 2016-08-01 31   15  229    50 
8 111 2016-09-01 29   15  258    50 
9 111 2016-10-01 31   10  289    50 
10 111 2016-11-01 29   5  318    50 
11 111 2016-12-01 27   0  345    50 
0 112 2016-01-01 31   55  31    55 
1 112 2016-01-02 26   45  57    55 
2 112 2016-01-03 31   40  88    55 
3 112 2016-01-04 30   35  118    55 
4 112 2016-01-05 31   30  149    55 
5 112 2016-01-06 30   25  179    55 
6 112 2016-01-07 31   25  210    55 
7 112 2016-01-08 31   20  241    55 
8 112 2016-01-09 30   20  271    55 
9 112 2016-01-10 31   15  302    55 
10 112 2016-01-11 29   10  331    55 
11 112 2016-01-12 31   0  362    55 

如果你想組合圖,您可以通過ID分組後在各組迭代。要繪製,首先設置索引並致電plot

fig, ax = plt.subplots(figsize=(8,6)) 
for i, g in df2.groupby('ID'): 
    g.plot(x='CumDays', y='Volume/Day', ax=ax, label=str(i)) 

plt.show() 

enter image description here

+0

@COLDSPEED的懸掛,感謝您的及時響應。代碼工作,選擇第一個值和所有的值。但是,情節是否可以通過身份證分開,而不是像現在一樣加入到一起。所以每個ID都有它自己的情節。在這種情況下,2個地塊。那可能嗎?謝謝 – dlvr

+0

@dlvr使用單獨的行編輯解決方案。 –

+0

@COLDSPEED,我的意思是,單獨的圖表。一個圖表爲111,第二個圖表爲112.這可能嗎?謝謝 – dlvr