2013-06-15 11 views
9

DataFrame.sortの期待される動作をNaN値の列で理解しようとしています。このデータフレームを考えるパンダネストソートとNaN

In [36]: df 
Out[36]: 
    a b 
0 1 9 
1 2 NaN 
2 NaN 5 
3 1 2 
4 6 5 
5 8 4 
6 4 5 

が1列を使用してソートするには、予想通り、最後にはNaNを置く:私が期待するよう

In [37]: df.sort(columns="a") 
Out[37]: 
    a b 
0 1 9 
3 1 2 
1 2 NaN 
6 4 5 
4 6 5 
5 8 4 
2 NaN 5 

しかし、ネストされたソートが動作しない、残さNaNはソートされていません:

In [38]: df.sort(columns=["a","b"]) 
Out[38]: 
    a b 
3 1 2 
0 1 9 
1 2 NaN 
2 NaN 5 
6 4 5 
4 6 5 
5 8 4 

ネストされたソートのNaNが最後に表示されるようにする方法はありますか?列ごとに?

+0

def dataframe_sort(df, columns, ascending=True): a = np.array(df[columns]) # ascending/descending array - -1 if descending, 1 if ascending if isinstance(ascending, bool): ascending = len(columns) * [ascending] ascending = map(lambda x: x and 1 or -1, ascending) ind = np.lexsort([ascending[i] * a[:, i] for i in reversed(range(len(columns)))]) return df.iloc[[ind]] 

使用例:これは、数値のみのために動作します!良い質問/見つける! –

+1

報告していただきありがとうございます[github](https://github.com/pydata/pandas/issues/3917)の問題として報告しました。 –

答えて

2

パンダで修正されるまで、これは私のニーズに合わせて、元のDataFrame.sort関数の機能のサブセットを使用しています。うーん...それは奇妙だ

In [4]: df 
Out[4]: 
    a b c 
10 1 9 7 
11 NaN NaN 1 
12 2 NaN 6 
13 NaN 5 6 
14 1 2 6 
15 6 5 NaN 
16 8 4 4 
17 4 5 3 

In [5]: dataframe_sort(df, ['a', 'c'], False) 
Out[5]: 
    a b c 
16 8 4 4 
15 6 5 NaN 
17 4 5 3 
12 2 NaN 6 
10 1 9 7 
14 1 2 6 
13 NaN 5 6 
11 NaN NaN 1 

In [6]: dataframe_sort(df, ['b', 'a'], [False, True]) 
Out[6]: 
    a b c 
10 1 9 7 
17 4 5 3 
15 6 5 NaN 
13 NaN 5 6 
16 8 4 4 
14 1 2 6 
12 2 NaN 6 
11 NaN NaN 1