2016-10-25 6 views
4

キャビン値のシリーズがあります。左はインデックス、右の列はキャビン値を保持します。 sort_valuesメソッドを使用した後は、値を部分的にしかソートできませんでした。タイタニックデータセットのキャビン値を正しくソートするのに問題があります。

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 

キャビンの文字を並べ替えることができるにもかかわらず、キャビンの文字に付けられた数字で並べ替えるのに問題があります。 だから私の所望の出力が

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 

である私は、NaNの値について特にないんだけど、私は、シリーズの最後にそれらをしたいと思います。孤独な "A"のような唯一のキャビン値には、必要に応じて "0"を追加することができますが、数字の付いていない文字をリストの最初に置きます。

私はいくつかのアイデアを与えられましたが、このコード(下記)が判明し、文字の順番が混乱しています。私はアルファベット順を保持したい。

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

ありがとうございました。 enter image description here

+0

可能デュープ:http://stackoverflow.com/questions/29580978/naturally-sorting-pandas-dataframe – EdChum

答えて

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) 

は、あなたが簡単に文字と数字に分割することができます

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

これは非常に巧妙です。 'df = df.ix [split_df.index]' ソートされたsplit_dfのインデックスに基づいてオリジナルのdfを暗黙的にソートする方法ですか?それはとても賢いです。 split_dfの2つの列の値を何らかの形で連結し、元の "Cabin"列を連結列に置き換えると仮定しました。 ありがとうございます。 – Moondra

+0

@moondraはい!ソートする方法です。 – piRSquared

+0

それは完全に動作しているようです。私は可能性のある並べ替えエラーについてデータフレームを徹底的にチェックしましたが、私は何も見ませんでした。 ありがとうございます。 – Moondra

2

+0

はOPの問題ではないかもしれませんが、これは文字コンポーネントが1文字に限られています。それは確かに速いので、プラス1。あなたは、賢い解決策だけでなく、答え全体を1つの部分に示すべきです。 – piRSquared