2016-12-13 2 views
2

Чтобы добавить к множеству отличных примеров этого, я пытаюсь изменить свои данные в формате, который я хочу.Pandas reshaping функции

Я в настоящее время есть данные, индексированные клиентом, категория покупки и дату, с наблюдениями за каждый период времени внутридневной через колоннах: 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

вы можете дать воспроизводимую версию dataframe? – MMF

+0

@MMF Я добавил скопированную текстовую таблицу, если это поможет. – arthuritus

ответ

2

Я думаю, что вам нужно groupby с агрегирование sum с перекроить по stack и unstack. Последний pop колонок level_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 
Смежные вопросы