2013-06-15 7 views
9

मैं NaN मानों वाले कॉलम पर DataFrame.sort के अपेक्षित व्यवहार को समझने की कोशिश कर रहा हूं।पांडस नेस्टेड सॉर्ट और NaN

इस 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 

एक स्तंभ का उपयोग छंटाई अंत में 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 

वहाँ यकीन है कि नेस्टेड प्रकार में Nans अंत में दिखाई देगी बनाने के लिए एक रास्ता है, प्रति कॉलम?

+0

खैर ... कि अजीब है! अच्छा सवाल/ढूंढो! –

+1

इसे [गिटूब पर जारी] के रूप में दायर किया गया (https://github.com/pydata/pandas/issues/3917), रिपोर्टिंग के लिए धन्यवाद! –

उत्तर

2

पांडस में तय होने तक, मूल डेटाफ्रेम.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 
संबंधित मुद्दे