2016-07-23 10 views
1

Ich habe eine datafram wie:Pandas die Zeilendaten transformieren, um die Spaltendaten

user_id category view collect 
1 1 a 2 3 
2 1 b 5 9 
3 2 a 8 6 
4 3 a 7 3 
5 3 b 4 2 
6 3 c 3 0 
7 4 e 1 4 

, wie es zu einem neuen Datenrahmen zu ändern, jeder User_id kann einmal vorkommen, dann die Kategorie mit dem Blick und sammeln erscheinen die Spalten, wenn keine Daten vorhanden sind, füllen sie mit 0, wie folgt aus:

user_id a_view a_collect b_view b_collect c_view c_collect d_view d_collect e_view e_collect 
1 2 3 5 6 0 0 0 0 0 0 
2 8 6 0 0 0 0 0 0 0 0 
3 7 3 4 2 3 0 0 0 0 0 
4 0 0 0 0 0 0 0 0 1 4 

Antwort

1

Das gewünschte Ergebnis kann mit den Werten aus user_id durch pivoting df, erhalten werden, den Index und die Werte von category zu einem Spaltenebene immer:

import numpy as np 
import pandas as pd 
df = pd.DataFrame({'category': ['a', 'b', 'a', 'a', 'b', 'c', 'e'], 
'collect': [3, 9, 6, 3, 2, 0, 4], 
'user_id': [1, 1, 2, 3, 3, 3, 4], 
'view': [2, 5, 8, 7, 4, 3, 1]}) 

result = (df.pivot(index='user_id', columns='category') 
      .swaplevel(axis=1).sortlevel(axis=1).fillna(0)) 

category a   b   c   e   
     view collect view collect view collect view collect 
user_id              
1   2.0  3.0 5.0  9.0 0.0  0.0 0.0  0.0 
2   8.0  6.0 0.0  0.0 0.0  0.0 0.0  0.0 
3   7.0  3.0 4.0  2.0 3.0  0.0 0.0  0.0 
4   0.0  0.0 0.0  0.0 0.0  0.0 1.0  4.0 

ergibt Oben, hat result ein Multiindex. Im Allgemeinen denke ich, dass dies gegenüber einem abgeflachten einzelnen Index vorzuziehen ist, da es mehr von der Struktur der Daten behält.

result.columns = ['{}_{}'.format(cat,col) for cat, col in result.columns] 
print(result) 

ergibt

  a_view a_collect b_view b_collect c_view c_collect e_view \ 
user_id                  
1   2.0  3.0  5.0  9.0  0.0  0.0  0.0 
2   8.0  6.0  0.0  0.0  0.0  0.0  0.0 
3   7.0  3.0  4.0  2.0  3.0  0.0  0.0 
4   0.0  0.0  0.0  0.0  0.0  0.0  1.0 

     e_collect 
user_id    
1    0.0 
2    0.0 
3    0.0 
4    4.0 
+0

Typeerror: Swaplevel() nimmt mindestens 3 Argumente (2 angegeben) Swaplevel –

+0

Danke, ändern

Jedoch kann die Multiindex in einen einzigen Index abgeflacht (Achse = 1) zu Swaplevel (0,1, Achse = 1) –

+0

Mit Pandas Version 0.18.1 oder höher sind die ersten beiden Argumente zu Swaplevel optional - es wechselt standardmäßig die letzten zwei Ebenen. – unutbu

Verwandte Themen