2016-12-19 4 views
7

मैं की तरहsort_by पांडा में टूटा> = 0.18.0?

print(df) 
        int   float _i 
1     2 2.000000e+00 1 
3     3 3.000000e+00 3 
2     3 4.000000e+00 2 
4 -9223372036854775808 -1.797693e+308 4 
0 -9223372036854775808 1.000000e+00 0 

एक डेटा फ्रेम के साथ शुरू करते हैं तो मैं sort_values का उपयोग दो कॉलम मैं उत्पादन आप नीचे देख पाने से सॉर्ट करने के। तो sort_values कुछ भी नहीं लगता है। अगर मैं केवल एक कॉलम नाम काम करता हूं, और जिस तरह से मैंने इसका उपयोग किया है, वह पिछले पांडा संस्करणों में काम करता है। क्या पांडों में कोई बदलाव है, मुझे पता नहीं है?

print(df.sort_values(["int", "float"])) 
        int   float _i 
1     2 2.000000e+00 1 
3     3 3.000000e+00 3 
2     3 4.000000e+00 2 
4 -9223372036854775808 -1.797693e+308 4 
0 -9223372036854775808 1.000000e+00 0 

पांडा में 0.17.0 मैं:

print(df.sort_values(["int", "float"])) 
        int   float _i 
4 -9223372036854775808 -1.797693e+308 4 
0 -9223372036854775808 1.000000e+00 0 
1     2 2.000000e+00 1 
3     3 3.000000e+00 3 
2     3 4.000000e+00 2 
+1

इसके अलावा, जाहिर है कि यदि आप दो कॉलम नामों का आदान-प्रदान करते हैं, तो आपको दो अलग ओ/ps ('v0.19.1') –

+0

मिलते हैं, मैं इसे 0.18.1 के साथ भी देख रहा हूं। –

+1

ठीक है, मुझे समस्या दिखाई देती है, ऐसा लगता है कि बड़े नकारात्मक int मान सॉर्टिंग तंत्र को फेंक रहा है, फ्लोट कॉलम पर सॉर्टिंग सही ढंग से काम करता है और अपेक्षित – EdChum

उत्तर

-1

मैं तरह फोन करके छँटाई आप अपने मामले के लिए इच्छा प्राप्त करने में सक्षम हूँ इस प्रकार है:

print(df.sort_values(by=["int", "float"], na_position='first')) 

        int   float _i 
3 -9223372036854775808 -1.797693e+308 4 
4 -9223372036854775808 1.000000e+00 0 
0     2 2.000000e+00 1 
1     3 3.000000e+00 3 
2     3 4.000000e+00 2 

हालांकि, मैं मुझे यकीन नहीं है कि सॉर्टिंग दो संस्करणों के बीच अलग क्यों व्यवहार कर रही है। मैंने गिटहब स्रोत कोड की जांच की और मुझे उन दो संस्करणों के बीच sort_values ​​फ़ंक्शन में कोई भी परिवर्तन दिखाई नहीं दिया। यह हो सकता है कि कोड में कुछ गहरा बदल गया है।

कोड है कि छँटाई करता है: _lexsort_indexer साथ

2968    if len(by) > 1: 
2968    from pandas.core.groupby import _lexsort_indexer 
2969  
2970    def trans(v): 
2971     if com.needs_i8_conversion(v): 
2972      return v.view('i8') 
2973     return v 
2974    keys = [] 
2975    for x in by: 
2976     k = self[x].values 
2977     if k.ndim == 2: 
2978      raise ValueError('Cannot sort by duplicate column %s' % str(x)) 
2979     keys.append(trans(k)) 
2980    indexer = _lexsort_indexer(keys, orders=ascending, 
2981           na_position=na_position) 
2982    indexer = com._ensure_platform_int(indexer) 

3004  new_data = self._data.take(indexer, axis=self._get_block_manager_axis(axis), 
3005          convert=False, verify=False) 

कुछ() या self._data.take() बदल गया हो।

+0

मैंने पहले से ही पांडा को एक बग फिक्स किया है। और कुछ कारणों से मूल्य 9 223372036854775808 जो कि सबसे छोटा 64 बिट int है/को "अनुपलब्ध मान" के रूप में माना जाता है। मुझे लगता है कि यह डेटाटाइम 64 डेटाटाइप को लागू करते समय किया गया था, जहां इस विशिष्ट मूल्य को आधिकारिक तौर पर फ्लोट के लिए "NaN" के समान "NaT" (एक समय नहीं) नाम दिया गया है। – rocksportrocker

+0

यहां ठीक है: https://github.com/pandas-dev/pandas/commit/6bea8275e504a594ac4fee71b5c941fb520c8b1a – rocksportrocker

+0

आप तेज़ हैं! धन्यवाद! –