2016-12-13 221 views
2

爲了增加許多優秀的例子,我試圖將我的數據重塑爲我想要的格式。熊貓重塑功能

我公司目前已通過客戶,購買類別和日期索引的數據,以跨列每一天內時間的觀察:我想購買分類彙總,並重塑使 Two categories, date and times

我的數據按日期和時間進行索引,而客戶顯示在各列中。

enter image description here

有什麼simplest way實現這一目標?

以文本的形式,原來的數據是這樣的:

<table><tbody><tr><th>Customer</th><th>Purchase Category</th><th>date</th><th>00:30</th><th>01:00</th><th>01:30</th></tr><tr><td>1</td><td>A</td><td>01/07/2012</td><td>1.25</td><td>1.25</td><td>1.25</td></tr><tr><td>1</td><td>B</td><td>01/07/2012</td><td>0.855</td><td>0.786</td><td>0.604</td></tr><tr><td>1</td><td>C</td><td>01/07/2012</td><td>0</td><td>0</td><td>0</td></tr><tr><td>1</td><td>A</td><td>02/07/2012</td><td>1.25</td><td>1.25</td><td>1.125</td></tr><tr><td>1</td><td>B</td><td>02/07/2012</td><td>0.309</td><td>0.082</td><td>0.059</td></tr><tr><td>1</td><td>C</td><td>02/07/2012</td><td>0</td><td>0</td><td>0</td></tr><tr><td>2</td><td>A</td><td>01/07/2012</td><td>0</td><td>0</td><td>0</td></tr><tr><td>2</td><td>B</td><td>01/07/2012</td><td>0.167</td><td>0.108</td><td>0.119</td></tr><tr><td>2</td><td>C</td><td>01/07/2012</td><td>0</td><td>0</td><td>0</td></tr><tr><td>2</td><td>A</td><td>02/07/2012</td><td>0</td><td>0</td><td>0</td></tr><tr><td>2</td><td>B</td><td>02/07/2012</td><td>0.11</td><td>0.109</td><td>0.123</td></tr></tbody></table>

+0

你能給你的數據幀的reproductible版本? – MMF

+0

@MMF如果有幫助,我添加了可複製的文本列表。 – arthuritus

回答

2

我認爲你需要groupbystackunstack聚集sum與重塑。最後poplevel_1,增加date和轉換to_datetime

print (df) 
    Customer Purchase Category  date 00:30 01:00 01:30 
0   1     A 01/07/2012 1.250 1.250 1.250 
1   1     B 01/07/2012 0.855 0.786 0.604 
2   1     C 01/07/2012 0.000 0.000 0.000 
3   1     A 02/07/2012 1.250 1.250 1.125 
4   1     B 02/07/2012 0.309 0.082 0.059 
5   1     C 02/07/2012 0.000 0.000 0.000 
6   2     A 01/07/2012 0.000 0.000 0.000 
7   2     B 01/07/2012 0.167 0.108 0.119 
8   2     C 01/07/2012 0.000 0.000 0.000 
9   2     A 02/07/2012 0.000 0.000 0.000 
10   2     B 02/07/2012 0.110 0.109 0.123 

df1 = df.groupby(['Customer','date']).sum().stack().unstack(0).reset_index() 
df1.date = pd.to_datetime(df1.date + df1.pop('level_1'), format='%d/%m/%Y%H:%M') 
print (df1) 
Customer    date  1  2 
0  2012-07-01 00:30:00 2.105 0.167 
1  2012-07-01 01:00:00 2.036 0.108 
2  2012-07-01 01:30:00 1.854 0.119 
3  2012-07-02 00:30:00 1.559 0.110 
4  2012-07-02 01:00:00 1.332 0.109 
5  2012-07-02 01:30:00 1.184 0.123