2013-06-15 4 views
9

NaN 값이있는 열에서 DataFrame.sort의 예상되는 동작을 이해하려고합니다. 이 DataFrame 감안할 때팬더 중첩 정렬 및 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 

하나의 열을 사용하여 정렬 예상대로, 마지막에 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

음 ... 그 이상한! 좋은 질문/찾아라! –

+1

보고에 대해 [github] (https://github.com/pydata/pandas/issues/3917)로이 문제를 신고했습니다. –

답변

2

팬더에서 수정되기 전까지는 원래 DataFrame.sort 기능의 하위 집합과 함께 내 요구 사항을 정렬하는 데 사용됩니다. 이것은 단지 숫자 값에 대해 작동합니다

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]] 

사용 예 :

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