2017-09-04 6 views
3

私は、データフレームのように持っている:私はAに従ってソートするソート列が

import pandas as pd 

df = pd.DataFrame({'A': ['286a2', '17', '286a1', '373', '200b', '150'], 'B': range(6)}) 

     A B 
0 286a2 0 
1  17 1 
2 286a1 2 
3 373 3 
4 200b 4 
5 150 5 

。私は

df.sort_values(by='A') 

を使用してこれを行うと私はほとんど正しいです

 A B 
5 150 5 
1  17 1 
4 200b 4 
2 286a1 2 
0 286a2 0 
3 373 3 

を得る:私は15017を持っていると思いますが、これらのエントリは単なる値ではないとして、これを行う方法がわかりません実際の文字列は数値と文字で構成されています。これを行う方法はありますか?

エントリのパターンについて

EDIT:

それは常に最初の任意の長さの数値であるが、それは再び数値が続くことができる文字、続くことができます。

+0

HMMを試すことができますし。それは 'df.sort_v alues'は関数定義を受け入れます。 –

答えて

2

あなたはsort_indexfloatにキャストで.replace文字を使用することができます。

df.index = df['A'].str.replace('[a-zA-Z]+','.').astype(float) 
df = df.sort_index().reset_index(drop=True) 
print (df) 
     A B 
0  17 1 
1 150 5 
2 200b 4 
3 286a1 2 
4 286a2 0 
5 373 3 
+0

は '' 286a2 ''ではありません。 **すべての**数字を最初に文字列から抽出することができます。 –

+0

これは '286a1'と' 286a2'エントリで失敗します。 – Cleb

+1

ニース、編集されたバージョンは素晴らしい(upvoted)作品。 – Cleb

1

別の変形をjezraelの

In [1706]: df.assign(
       A_=df.A.str.replace('[/\D]', '.').astype(float) # or '[a-zA-Z]+' 
      ).sort_values(by='A_').drop('A_', 1) 
Out[1706]: 
     A B 
1  17 1 
5 150 5 
4 200b 4 
2 286a1 2 
0 286a2 0 
3 373 3 
+0

はい、ありがとうの代替(またupvoted)。 – Cleb

1

それとも、natsort

from natsort import natsorted, ns 
df.set_index('A').reindex(natsorted(df.A, key=lambda y: y.lower())).reset_index() 
Out[395]: 
     A B 
0  17 1 
1 150 5 
2 200b 4 
3 286a1 2 
4 286a2 0 
5 373 3 
+0

うまく動作します。このライブラリ(upvoted)を知らなかった... – Cleb

+0

@クレブYw、素敵な日〜:)! – Wen