2016-09-06 3 views
2

Betrachten Sie das folgende pandas.Series Objekt:Methode zum Sortieren von Werten in Reihe in Pandas-Serie?

import pandas as pd 

s = pd.Series(["hello there you would like to sort me", "sorted i would like to be", "the yankees played the red sox", "apple apple banana fruit orange cucumber"]) 

Ich möchte die Werte innerhalb jede Zeile, ähnlich dem folgenden Ansatz sortieren:

for row in s.index: 
    split_words = s.loc[row].split() 
    split_words.sort() 
    s.loc[row] = " ".join(split_words) 

ich eine große Datenmenge haben, aber so Vektorisierung ist hier wichtig. Wie kann ich Pandas str Attribut verwenden, um das gleiche zu erreichen, aber viel schneller?

Antwort

2

Verwenden Sie die Zeichenfolge Accessor str und split. Dann wenden Sie sorted und join an.

s.str.split().apply(sorted).str.join(' ') 

0  hello like me sort there to would you 
1     be i like sorted to would 
2    played red sox the the yankees 
3 apple apple banana cucumber fruit orange 
dtype: object 
+0

Grünes Häkchen, weil Sie 'pandas.Series.str' Methode verwendet haben, wie oben in Frage gestellt. – blacksite

4

Ich habe erlebt, dass Python-Listen in diesen Situationen besser funktionieren. piRSquared Logik der Anwendung, eine Liste Verständnis wäre:

[' '.join(sorted(sentence.split())) for sentence in s.tolist()] 

Für Timings I Shakespeares Werken von Peter Norvig's website benutzt habe.

s = pd.read_table('shakespeare.txt', squeeze=True, header=None) 
s = pd.Series(s.tolist()*10) 
r1 = s.str.split().apply(sorted).str.join(' ') 
r2 = pd.Series([' '.join(sorted(sentence.split())) for sentence in s.tolist()]) 

r1.equals(r2) 
Out: True 

%timeit s.str.split().apply(sorted).str.join(' ') 
1 loop, best of 3: 2.71 s per loop 

%timeit pd.Series([' '.join(sorted(sentence.split())) for sentence in s.tolist()]) 
1 loop, best of 3: 1.95 s per loop 
Verwandte Themen