2016-12-13 182 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