熊猫重塑功能

时间:2016-12-13 10:46:39

标签: python pandas pivot reshape

为了添加许多优秀的例子,我试图将我的数据重塑为我想要的格式。

我目前拥有按客户,购买类别和日期编制索引的数据,并对每列的每个日内时段进行观察: 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>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

我认为您需要groupby汇总sum并重新制作stackunstack。最后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