2013-06-15 17 views
9

Próbuję zrozumieć oczekiwane zachowanie DataFrame.sort w kolumnach z wartościami NaN.Pandy sortowane i NaN

Biorąc pod uwagę to DataFrame:

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 

Sortowanie przy użyciu jednej kolumny stawia NaN na końcu, zgodnie z oczekiwaniami:

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 

Ale zagnieżdżonych sortowania nie zachowują się jak bym się spodziewał, pozostawiając NaN nieposortowane:

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 

Czy istnieje sposób, aby upewnić się, że Koncepcja nieliczby w rodzaju zagnieżdżonego pojawi się na końcu, na kolumnę?

+0

Cóż ... to jest dziwne! Dobre pytanie/znajdź! –

+1

Zapisano to jako [wydanie na github] (https://github.com/pydata/pandas/issues/3917), dzięki za zgłoszenie! –

Odpowiedz

2

Do czasu naprawienia w Pandach, to jest to, czego używam do sortowania według moich potrzeb, z podzbiorem funkcjonalności oryginalnej funkcji DataFrame.sort. Będzie to działać tylko wartości liczbowe: przykład

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

Zastosowanie:

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 
Powiązane problemy