2017-07-27 2 views
-1

ich rudern haben folgende Datenrahmen:Python konvertieren mehrere Listen für bestimmte Listen

network date  count2 count3 user2  user3 
3   20170721 [6, 7] [1,3] [57,88] [47,58] 
4   20170721 [6]  []  [12]  [] 
43  20170721 []  [7,2] []  [57,62] 

und ich möchte die Liste pro Zeile spalten, sondern zählen und Benutzer entsprechen müssen:

network date  count2 count3 user2 user3 
3   20170727 6  Nan  57  Nan 
3   20170727 7  Nan  88  Nan 
3   20170727 Nan  1  Nan  47 
3   20170727 Nan  3  Nan  58 
4   20170727 6  Nan  12  Nan 
43  20170727 Nan  7  Nan  57 
43  20170727 Nan  2  Nan  62 

Wie kann ich es schnell machen? Die Benutzerliste ist in Wirklichkeit wirklich lang (mehr als 50k Eintrag). Vielen Dank!

+1

Was Sie bisher versucht haben? Können Sie mir zeigen, was die Ergebnisse sind, wenn Sie den Datenrahmen mit .asarray in ein Array konvertieren? –

+1

Zeigen Sie uns, was Sie getan haben, auch wenn es langsam ist – minhhn2910

+0

Was meinen Sie mit "Anzahl und Benutzer muss entsprechen"? Sie zeigen keine Beispiele für entsprechende Zähl- und Benutzerwerte außer "Nan". Was ist Ihr erwartetes Ergebnis? Was genau bedeutet "Aufteilen der Liste pro Zeile"? Was passiert mit jeder Datenzeile ??? –

Antwort

1

Eine Möglichkeit, dies zu tun und das Ergebnis zu erreichen, das Sie ohne all das zusätzliche NaN suchen.

df = pd.DataFrame({'network':[3,4,43],'date':['20170721']*3, 
        'count2':[[6,7],[6],[]], 
        'count3':[[1,3],[],[7,2]], 
        'user2':[[57,88],[12],[]], 
        'user3':[[47,58],[],[57,62]]}) 

df = df.set_index(['network','date']) 

(df.apply(lambda x: pd.DataFrame(x.tolist(),index=x.index) 
         .stack() 
         .rename(x.name)) 
    .reset_index()) 

Ausgang:

network  date level_2 level_0 count2 count3 user2 user3 
0  3 20170721  0  0.0  6.0  1.0 57.0 47.0 
1  3 20170721  1  NaN  7.0  3.0 88.0 58.0 
2  4 20170721  0  1.0  6.0  NaN 12.0 NaN 
3  43 20170721  0  2.0  NaN  7.0 NaN 57.0 
4  43 20170721  1  NaN  NaN  2.0 NaN 62.0 
Verwandte Themen