2016-08-09 6 views
3

非標準の順序でパンダの行をソートする方法、言う:私はパンダのデータフレームを持って

df = pd.DataFrame ([['a', 3, 3], ['b', 2, 5], ['c', 4, 9], ['d', 1, 43]], columns = ['col 1' , 'col2', 'col 3']) 

か:私はCOL2でソートしたい場合は

col 1 col2 col 3 
0  a  3  3 
1  b  2  5 
2  c  4  9 
3  d  1  43 

、私が使用することができますdf.sort、それは昇順と降順にソートされます。

ただし、col2が[4,2,1,3]になるように行を並べ替えるにはどうすればよいですか?

+0

[4,2,1,3]はDataFrameの列の関数ですか、別のプロセスのリストとして持っていますか? – ayhan

+0

これは他のプロセスのリストです。それは恣意的です。 –

+0

実際の例では、完全に分離したDFから来たバンチ文字列です。また、Col 2に重複があるかもしれませんが、それは問題ではないと私は考えています –

答えて

3

1つの方法は、任意の順序を持​​つことができるCategoricalタイプに変換することです。

In [51]: df['col2'] = df['col2'].astype('category', categories=[4, 1, 2, 3], ordered=True) 

In [52]: df.sort_values('col2') 
Out[52]: 
    col 1 col2 col 3 
2  c 4  9 
3  d 1  43 
1  b 2  5 
0  a 3  3 
+0

それはスマートな解決策です! – MaxU

+0

これは、リスト内の複製が互いに隣り合っている場合にのみ機能すると思います。 – ayhan

+0

@ayhan、このようにテストしたところ、 'df = pd.concat([df] * 5、ignore_index = True).sample(frac = 1).reset_index(); df ['col2'] = df ['col2']。astype( 'category'、categories = [4,1,2,3]、ordered = True); df.sort_values( 'col2') ' - 正しく動作しました... – MaxU

3

このお試しください:

sortMap = {4:1, 2:2, 1:3,3:4 } 
df["new"] = df2['col2'].map(sortMap) 
df.sort_values('new', inplace=True) 
df 

    col1 col2 col3 new 
2 c  4  9 1 
1 b  2  5 2 
3 d  1 43 3 
0 a  3  3 4 

代替方法辞書を作成する:

ll  = [4, 2, 1, 3] 
sortMap = dict(zip(ll,range(len(ll)))) 
1

代替ソリューション:

In [409]: lst = [4, 2, 1, 3] 

In [410]: srt = pd.Series(np.arange(len(lst)), index=lst) 

In [411]: srt 
Out[411]: 
4 0 
2 1 
1 2 
3 3 
dtype: int32 

In [412]: df.assign(x=df.col2.map(srt)) 
Out[412]: 
    col 1 col2 col 3 x 
0  a  3  3 3 
1  b  2  5 1 
2  c  4  9 0 
3  d  1  43 2 

In [413]: df.assign(x=df.col2.map(srt)).sort_values('x') 
Out[413]: 
    col 1 col2 col 3 x 
2  c  4  9 0 
1  b  2  5 1 
3  d  1  43 2 
0  a  3  3 3 

In [414]: df.assign(x=df.col2.map(srt)).sort_values('x').drop('x',1) 
Out[414]: 
    col 1 col2 col 3 
2  c  4  9 
1  b  2  5 
3  d  1  43 
0  a  3  3 

注:私は@chrisb's solutionもっと好きですか - それはずっとですよりエレガントで広々とした明らかに速く動作します

関連する問題