Pandas 重塑函数

Pandas reshaping functions

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

我目前有按客户、购买类别和日期索引的数据,以及跨列的每个日内时间段的观察结果:

我想按购买类别进行聚合,并重新整形,以便我的数据按日期和时间编制索引,而客户出现在各列中。

实现此目标的 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>

我想你需要 groupby with aggregating sum with reshape by stack and unstack. Last pop column level_1, add to date and convert 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