2016-07-15 12 views
1

Dies ist mein Datenframe (mit vielen weiteren Buchstaben und einer Länge von ~ 35,5k) und Zeug wo die - sind andere relevante Strings). Alle Variablen sind Zeichenfolgen und ['C1', 'C2'] ist der MultiIndex.Geteilte Zeilen nach Text in zwei Spalten (Python, Pandas)

tmp 

C1 C2  C3 C4 C5 Start End  C8 
A  1  -  -  - 12  14  - 
A  2  -  -  - 1,4,7 3,6,10 - 
A  3  -  -  - 16,19 17,21 - 
A  4  -  -  - 22  24  - 

Ich brauche es, dies zu werden (Split jede Zeile, die Kommas Aufrechterhaltung alles andere enthält):

C1 C2  C3 C4 C5 Start End C8 Appearance 
A  1  -  -  - 12  14 - 1 
A  2  -  -  - 1  3  - 1 
A  2  -  -  - 4  6  - 2 
A  2  -  -  - 7  10 - 3 
A  3  -  -  - 16  17 - 1 
A  3  -  -  - 19  21 - 2 
A  4  -  -  - 22  24 - 1 

Ich habe versucht, dieses Skript pandas: How do I split text in a column into multiple rows?

als

s = tmp['Start'].str.split(',').apply(Series, 1).stack() 
s.index = s.index.droplevel(-1) 
s.name = 'Start 
del tmp['Start'] 
final = tmp.join(s) 

Aber dann ist das Ergebnis viel größer als es sollte! Ich bekomme Tausende von Wiederholungen und das versucht nur, Start zu teilen. Ich kann nicht einmal vorstellen, dies zu tun versuchen, sowohl für Start und Ende (jedes Komma in ‚Start‘ impliziert ein Komma in ‚Ende‘.

Lengths: 
tmp = 35568 
s  = 35676 
final = 293408 
+0

Ist das nicht erwartet? Wenn Sie [1, 4, 7] hintereinander haben, haben Sie zwei zusätzliche Zeilen im Ergebnis. – ayhan

Antwort

3

Sie neue df von s1 erstellen und s2 und dann join. auch ist eine bessere Nutzung Parameter expand=True in str.split und mehrere Spalten löschen, indem drop.

Zur Erstellung Spalte Appearance Verwendung groupby von index mit cumcount

s1 = tmp['Start'].str.split(',', expand=True).stack() 
s1.index = s1.index.droplevel(-1) 
s1.name = 'Start' 

s2 = tmp['End'].str.split(',', expand=True).stack() 
s2.index = s2.index.droplevel(-1) 
s2.name = 'End' 
tmp.drop(['Start', 'End'], inplace=True, axis=1) 

df = pd.DataFrame({'s1':s1, 's2':s2}, index=s1.index) 
final = tmp.join(df) 

final['Appearance'] = final.groupby(final.index).cumcount() + 1 
print (final) 
    C1 C2 C3 C4 C5 C8 s1 s2 Appearance 
0 A 1 - - - - 12 14   1 
1 A 2 - - - - 1 3   1 
1 A 2 - - - - 4 6   2 
1 A 2 - - - - 7 10   3 
2 A 3 - - - - 16 17   1 
2 A 3 - - - - 19 21   2 
3 A 4 - - - - 22 24   1 

EDIT von Kommentar:

können Sie versuchen, reset_index zuerst:

print (tmp) 
     C3 C4 C5 Start  End C8 
C1 C2       
A 1 - - -  12  14 - 
    2 - - - 1,4,7 3,6,10 - 
    3 - - - 16,19 17,21 - 
    4 - - -  22  24 - 

tmp.reset_index(inplace=True) 
print (tmp) 
    C1 C2 C3 C4 C5 Start  End C8 
0 A 1 - - -  12  14 - 
1 A 2 - - - 1,4,7 3,6,10 - 
2 A 3 - - - 16,19 17,21 - 
3 A 4 - - -  22  24 - 
+0

"[293408 Zeilen x 7 Spalten]" Sollte es nicht die gleiche Anzahl von Zeilen wie s1/s2 haben? (~ 35k) – Nico

+0

Ist die Länge 's1' und' s2' gleich? ist der Index von "s1" gleich dem Index von "s2"? – jezrael

+0

Ja! Jedes Komma in Start gibt ein Komma in End an. – Nico

2

ich die erweiterte 'Start' und 'End' Spalten Concat sie sogar zusammenpassen, um sicherzustellen, wenn sie nicht über die gleiche Anzahl von Einträge.

s = tmp.Start.str.split(',', expand=True).stack().rename('Start') 
e = tmp.End.str.split(',', expand=True).stack().rename('End') 
se = pd.concat([s, e], axis=1).reset_index(1, drop=True) 

tmp.drop(['Start', 'End'], axis=1).merge(se, left_index=True, right_index=True) 

enter image description here

+0

'TypeError: split() hat ein unerwartetes Schlüsselwortargument 'expand'' erhalten. – Nico

+0

@Nico drop the argument. Sie verwenden eine ältere Pandas-Version. – piRSquared

+0

Deine Antwort ist auch nett;) +1 – jezrael

Verwandte Themen