2016-12-19 98 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

除此之外,顯然如果你交換兩個列名,你會得到兩個不同的o/ps('v0.19.1') –

+0

我也看到這個。 –

+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 

然而,我我不知道爲什麼排序在兩個版本之間表現不同。我檢查了GitHub源代碼,並且我沒有看到這兩個版本之間的sort_values函數有任何更改。這可能是代碼中更深層的東西發生了變化。這並排序

代碼:

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) 

一些與_lexsort_indexer()或self._data.take()可能已經改變。

+0

我已經對熊貓進行了錯誤修復。由於某些原因,最小的64位int值9223372036854775808被視爲「缺失值」。我假設這是在實現datetime64數據類型時完成的,其中該特定值被正式命名爲「NaT」(而不是時間),類似於用於float的「NaN」。 – rocksportrocker

+0

下面是修復:https://github.com/pandas-dev/pandas/commit/6bea8275e504a594ac4f​​ee71b5c941fb520c8b1a – rocksportrocker

+0

你很快!謝謝! –