2016-04-19 12 views
1

Ich möchte die Daten von einem Datenrahmen in mehrere Datenrahmen oder Gruppen ordnen. Die Eingangsdaten istSlicing und Anordnung von Datenrahmen in Pandas

id channel path 
15 direct a1 
15 direct a2 
15 direct a3 
15 direct a4 
213 paid b2 
213 paid b1 
2222 direct as25 
2222 direct dw46 
2222 direct 32q 
3111 paid d32a 
3111 paid 23ff 
3111 paid www32 
3111 paid 2d2 

Die gewünschte Ausgabe sollte wie sein

id channel p1 p2  
213 paid b2 b2  

id channel p1 p2 p3 
2222 direct as25 dw46 dw46  

id channel p1 p2 p3 p4 
15 direct a1 a2 a3 a4 
3111 paid d32a 23ff www32 2d2 

Bitte wählen Sie die Art, wie ich es erreichen kann. Danke

+0

Verwenden Codeblocks anstelle von Bildern, das wäre es für andere leicht machen Ihr Beispiel zu reproduzieren. – Zero

+0

sicher, werde das tun. –

Antwort

1

Ich denke, dass Sie Helfersäule cols zuerst durch cumcount und dann pivot_table schaffen können. Dann müssen Sie die Länge notnull Spalten (substract ersten 2) und groupby von diesem length finden. Letzte dropna Spalten in jeder Gruppe:

df['cols'] = 'p' + (df.groupby('id')['id'].cumcount() + 1).astype(str) 

df1 = df.pivot_table(index=['id', 'channel'], 
        columns='cols', 
        values='path', 
        aggfunc='first').reset_index().rename_axis(None, axis=1) 

print df1 
    id channel p1 p2  p3 p4 
0 15 direct a1 a2  a3 a4 
1 213 paid b2 b1 None None 
2 2222 direct as25 dw46 32q None 
3 3111 paid d32a 23ff www32 2d2 

print df1.apply(lambda x: x.notnull().sum() - 2 , axis=1) 
0 4 
1 2 
2 3 
3 4 
dtype: int64 

for i, g in df1.groupby(df1.apply(lambda x: x.notnull().sum() - 2 , axis=1)): 
    print i 
    print g.dropna(axis=1) 
2 
    id channel p1 p2 
1 213 paid b2 b1 
3 
    id channel p1 p2 p3 
2 2222 direct as25 dw46 32q 
4 
    id channel p1 p2  p3 p4 
0 15 direct a1 a2  a3 a4 
3 3111 paid d32a 23ff www32 2d2 

Zum Speichern Sie dictionary von DataFrames verwenden können:

dfs={i: g.dropna(axis=1)   
    for i, g in df1.groupby(df1.apply(lambda x: x.notnull().sum() - 2 , axis=1))} 

#select DataFrame with len=2  
print dfs[2] 
    id channel p1 p2 
1 213 paid b2 b1 

#select DataFrame with len=3  
print dfs[3] 
    id channel p1 p2 p3 
2 2222 direct as25 dw46 32q 
+0

Ich bekomme einen Fehler # renamer Funktion, wenn ein Diktat übergeben [TypeError: muss einen Index übergeben, um umzubenennen] –

+0

Ich denke, Sie müssen 'Pandas' Version '0.18.0' verwenden. Aber wenn Ihre Version niedriger ist, lassen Sie '.rename_axis (None, axis = 1) weg.' – jezrael

+0

Ich bin sehr dankbar für Ihre Hilfe. –