2016-06-15 1 views
2

У меня есть данные, которые мне нужно собрать за каждый столбец, а затем за столбец. Мне нужны полные затраты на каждую категорию продукта для каждого уникального клиента. Multiindex должен это сделать. Проблема в том, что я новичок в Pandas, и я не понимаю многоиндекс.Pandas, mulitindexing

У меня есть данные структурированы, как это:

Customer Products Amount 
1 001  Toys  5 
2 002  Toys  6 
3 002  Cars  7 
4 001  Toys  2 
5 001  Cars  9 

мне это нужно так:

Customers Products  Sum of ammount 
001  Toys   7 
      Cars   9 
002  Toys   6 
      Cars   7 

Позже мне нужно, чтобы преобразовать его так, что я могу получить общие расходы в каждой категории продукции на одного клиента ,

Customer Toys Cars 
001  7 9 
002  6 7 

Я играл с кодом, но я застрял. Читали, но не нашли точно, что я ищу.

ответ

1

Я думаю, что вы можете использовать groupby с sum:

df1 = df.groupby(['Customer','Products'])['Amount'].sum().reset_index(name='Sum of ammount') 
print (df1) 
    Customer Products Sum of ammount 
0  001  Cars    9 
1  001  Toys    7 
2  002  Cars    7 
3  002  Toys    6 

Затем вы можете использовать pivot из df1:

print (df1.pivot(index='Customer',columns='Products',values='Sum of ammount')) 
Products Cars Toys 
Customer    
001   9  7 
002   7  6 

Если потребность pivot_table от df:

print (df.pivot_table(index='Customer',columns='Products',values='Amount', aggfunc=sum)) 
Products Cars Toys 
Customer    
001   9  7 
002   7  6 

EDIT:

Для симпатичнее df вы можете reset_index с rename_axis (новый в pandas0.18.0):

print (df.pivot_table(index='Customer',columns='Products',values='Amount', aggfunc=sum) 
     .reset_index() 
     .rename_axis(None, axis=1)) 

    Customer Cars Toys 
0  001  9  7 
1  002  7  6 

print (df1.pivot(index='Customer',columns='Products',values='Sum of ammount') 
      .reset_index() 
      .rename_axis(None, axis=1)) 

    Customer Cars Toys 
0  001  9  7 
1  002  7  6 
+0

Спасибо Jezrael. Я в конечном итоге сделаю это на 30 миллионов строк, и я беспокоюсь о ОЗУ с точкой опоры. У меня есть 32 ГБ. Насколько эффективен поворот? – user6453877

+0

Phhhooo, сложный вопрос, но 'pivot' очень сложный и память потребляет операцию. Но вы можете попробовать. – jezrael

+0

И мне очень любопытно, как это работает с вашим большим 'DataFrame'. – jezrael