2013-06-15 46 views
9

Tôi đang cố gắng hiểu hành vi mong đợi của DataFrame.sort trên các cột có giá trị NaN.Pandas lồng nhau sắp xếp và NaN

Với DataFrame này:

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 

Phân loại sử dụng một cột đặt NaN ở cuối, như mong đợi:

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 

Nhưng lồng loại không cư xử như tôi mong đợi, bỏ rơi NaN chưa được phân loại:

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 

Có cách nào để đảm bảo NaN trong sắp xếp lồng nhau sẽ xuất hiện ở cuối, mỗi cột?

+0

Vâng ... đó là lạ! Câu hỏi hay/tìm! –

+1

Nộp đơn này dưới dạng [vấn đề về github] (https://github.com/pydata/pandas/issues/3917), cảm ơn bạn đã báo cáo! –

Trả lời

2

Cho đến khi được khắc phục trong Pandas, đây là những gì tôi đang sử dụng để phân loại cho các nhu cầu của mình, với một tập con của chức năng của hàm DataFrame.sort ban đầu. Điều này sẽ làm việc cho chỉ các giá trị số: ví dụ

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

Cách sử dụng:

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 
Các vấn đề liên quan