2016-09-06 2 views
2

は以下pandas.Seriesオブジェクトを考慮してくださいパンダで行の値をソートする方法シリーズ?

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"]) 

I、値を以下の手法と同様内の各列をソートしたい:

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

Iしかし、そう、巨大なデータセットを有しますここでベクトル化が重要です。 pandas strの属性を使って同じことを達成するにはどうすればよいですか?

答えて

2

文字列アクセサstrsplitを使用します。その後、sortedjoinを適用します。

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

上記の質問のように 'pandas.Series.str'メソッドを使用したため、緑色のチェックマークが付いています。 – blacksite

4

このような状況では、Pythonのリストが優れていることを経験しました。 piRSquaredのロジックを適用すると、リストの内包は次のようになります。私はPeter Norvig's websiteからシェイクスピアの作品を使用していた時期については

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

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 
関連する問題