2017-04-19 5 views
2

ich erstellen Sie die folgende Datenrahmen:Pandas - Wie gruppiert man Unterspalten eines Datenrahmens?

  Date ProductID SubProductId Value 
0 2015-01-02   1    1  11 
1 2015-01-02   1    2  12 
2 2015-01-02   1    3  NaN 
3 2015-01-02   1    4  NaN 
4 2015-01-02   2    1  14 
5 2015-01-02   2    2  15 
6 2015-01-02   2    3  16 
7 2015-01-03   1    1  17 
8 2015-01-03   1    2  18 
9 2015-01-03   1    3  NaN 
10 2015-01-03   1    4  21 
11 2015-01-03   2    1  20 
12 2015-01-03   2    2  21 

Und dann der Gruppe I die Teilprodukte durch Produkte:

df.set_index(['Date','ProductID','SubProductId']).unstack(['ProductID','SubProductId']) 

und ich möchte folgendes erhalten:

   Value 
ProductID  1      2 
SubProductId  1  2  3  4  1  2  3 
Date 
2015-01-02 11.0 12.0 NaN NaN 14.0 15.0 16.0 
2015-01-03 17.0 18.0 NaN 21.0 20.0 21.0 NaN 

Aber was es tut, wenn ich es drucke, dass es jede Spalte zieht, die mit etwas NaN am Ende anfängt:

    Value 
    ProductID  1   2     1 
    SubProductId  1  2  1  2  3  4  3 
    Date 
    2015-01-02 11.0 12.0  14.0 15.0 16.0 NaN NaN 
    2015-01-03 17.0 18.0  20.0 21.0 NaN 21.0 NaN 

Wie werden alle Unterspalten unter der entsprechenden Spalte gruppiert? auch die Unter Spalten, die NaN

NB enthalten: Versionen verwendet:

  • Python-Version: 3.6.0
  • Pandas Version: 0.19.2
+0

so Frage i Wie bekomme ich NaN-Spalten als Endspalten? – jezrael

+0

Der Code, wie er gepostet wird, produziert das Ergebnis, das du sagst. Welche Version von Pandas, Python benutzt du? – Grr

Antwort

2

Wenn Sie bestellt Spalte haben wollen Namen können Sie sort_level mit axis = 1 verwenden, um den Spaltenindex zu sortieren:

df1 = df.set_index(['Date','ProductID','SubProductId']).unstack(['ProductID','SubProductId']) 

# sort in descending order 
df1.sortlevel(axis=1, ascending=False) 

#    Value         
#ProductID  2     1     
#SubProductId  3  2  1  4 3  2  1 
#Date             
#2015-01-02 16.0 15.0 14.0 NaN NaN 12.0 11.0 
#2015-01-03  NaN 21.0 20.0 21.0 NaN 18.0 17.0 

# sort in ascending order 
df1.sortlevel(axis=1, ascending=True) 

#    Value         
#ProductID  1      2    
#SubProductId  1  2 3  4  1  2  3 
#Date             
#2015-01-02 11.0 12.0 NaN NaN 14.0 15.0 16.0 
#2015-01-03 17.0 18.0 NaN 21.0 20.0 21.0 NaN 
Verwandte Themen