2016-10-25 1 views
4

Ich habe also eine Reihe von Kabinenwerten; Die linke Seite ist der Index und die rechte Spalte enthält die Kabinenwerte. Nach der Methode sort_values ​​konnte ich die Werte nur teilweise sortieren.Probleme beim Sortieren der Kabinenwerte des Titanic-Datensatzes

x = Cabin_Fare=Cabin_Fare.sort_values(['Cabin' ]) 

210  A31 
186  A32 
446  A34 
1185  A34 
1266  A34 
807  A36 
97  A 
24  A6 
175  A7 
1058  B10 
738  B101 
816  B102 
1107  B11 
330  B18 
524  B18 
171  B19 
691  B20 
660  D48 
682  D49 
626  D50 
22  D56 
783  D6 
276  D7 
628  D9 
430  E10 
718  E101 
304  E101 
124  E101 
461  E12 
752  E121 
1234  NaN 
1252  NaN 
1257  NaN 
73  NaN 
121  NaN 

Das Problem, das ich habe, ist, trotz der Lage, die Kabine Buchstaben zu sortieren, ich habe Probleme mit den Zahlen Sortierung in der Kabine Buchstaben angebracht. Also meine gewünschte Ausgabe ist

97  A 
24  A6 
175  A7 
210  A31 
186  A32 
446  A34 
1185  A34 
1266  A34 
807  A36 
1058  B10 
1107  B11 
330  B18 
524  B18 
171  B19 
691  B20 
738  B101 
816  B102 
........ 

1234  NaN 
1252  NaN 
1257  NaN 
73  NaN 
121  NaN 

ich nicht besonders über den NaN-Wert bin, aber ich würde sie am Ende der Serie mag. Bei den einsamen Kabinenwerten wie dem einsamen "A" könnte bei Bedarf eine "0" hinzugefügt werden, aber ich möchte, dass die Buchstaben ohne Zahlen an erster Stelle auf der Liste stehen.

Ich wurde ein paar Ideen gegeben, aber es stellt sich heraus, dass dieser Code (unten), mit der Reihenfolge der Buchstaben verstimmt. Ich möchte die alphabetische Reihenfolge beibehalten.

x.reindex(x[x.notnull()].str[1:].replace('', 0).astype(int).sort_values().index) 

Danke.

+0

möglich Betrogene: http://stackoverflow.com/questions/29580978/naturally-sorting-pandas-dataframe – EdChum

Antwort

3
# setup regex for str.extract 
# ?P<letter> tells pandas to make that a column with name 'letter' 
regex = '(?P<letter>\D+)(?P<digit>\d*)' 
# easy access to column names I'm making in extract step 
cols = ['letter', 'digit'] 

# run extract. will pull out letter and digit 
split_df = df.Cabin.str.extract(regex, expand=True) 
# make sure digit column is numeric and fill with 0 
split_df['digit'] = pd.to_numeric(split_df['digit'], 'coerce').fillna(0) 
# sort by cols gets us the right sort 
split_df.sort_values(cols, inplace=True) 
# use sorted split_df.index for a slice 
df = df.ix[split_df.index] 
df.head(20) 

enter image description here

+0

Wow, das ist sehr schlau. Nur eine Frage zu dieser Codezeile: 'df = df.ix [split_df.index]' Ist dies eine implizite Art der Sortierung der ursprünglichen df basierend auf dem Index der sortierten split_df? Das ist sehr schlau. Ich nahm an, dass Sie die Werte der beiden Spalten von split_df irgendwie verketten und dann die ursprüngliche "Cabin" -Spalte durch die verkettete Spalte ersetzen würden. Vielen Dank. – Moondra

+0

@moondra ja! Es ist eine Art zu sortieren. – piRSquared

+0

Es scheint perfekt zu funktionieren. Ich habe den Datenrahmen sorgfältig auf mögliche Sortierfehler überprüft, und ich habe keine gesehen. Danke. – Moondra

2

Sie können es leicht aufgeteilt in Buchstaben und Zahlen:

letter, numbers = cabin[0], cabin[1:] 
+0

ist möglicherweise nicht der Fall in OP-Problem, aber dies ist auf die Briefkomponente beschränkt, die ein Zeichen ist. aber plus eins, weil es sicherlich schneller sein wird. Sie sollten die gesamte Antwort und nicht nur die clevere Lösung für einen Teil zeigen. – piRSquared

Verwandte Themen