1. ホーム
  2. python

[解決済み] pandasのデータフレームでカスタムソートする

2022-05-16 08:36:40

質問

Python pandasのdataframeがあり、その中の列は月の名前を含んでいます。

どのように私は、例えば、辞書を使用して、カスタムの並べ替えを行うことができます。

custom_dict = {'March':0, 'April':1, 'Dec':3}  

どのように解決するのですか?

Pandas 0.15を導入しました。 カテゴリカルシリーズ を導入し、より明確な方法でこれを行うことができるようになりました。

まず、月の列をカテゴリカルにし、使用する順序を指定します。

In [21]: df['m'] = pd.Categorical(df['m'], ["March", "April", "Dec"])

In [22]: df  # looks the same!
Out[22]:
   a  b      m
0  1  2  March
1  5  6    Dec
2  3  4  April

これで、月の列をソートすると、そのリストに関してソートされます。

In [23]: df.sort_values("m")
Out[23]:
   a  b      m
0  1  2  March
2  3  4  April
1  5  6    Dec

注意:値がリストにない場合はNaNに変換されます。


興味のある人のための古い答え...

中間シリーズを作成して set_index をその上に置く。

df = pd.DataFrame([[1, 2, 'March'],[5, 6, 'Dec'],[3, 4, 'April']], columns=['a','b','m'])
s = df['m'].apply(lambda x: {'March':0, 'April':1, 'Dec':3}[x])
s.sort_values()

In [4]: df.set_index(s.index).sort()
Out[4]: 
   a  b      m
0  1  2  March
1  3  4  April
2  5  6    Dec


コメントされているように、新しいpandasでは、Seriesに replace メソッドがあり、これをよりエレガントに行うことができます。

s = df['m'].replace({'March':0, 'April':1, 'Dec':3})

わずかな違いは、辞書の外に値がある場合、これは発生しないことです(それはそのままです)。