【问题标题】:How to sort a pandas series of both index and values?如何对索引和值的熊猫系列进行排序? [复制]
【发布时间】:2018-01-20 12:31:00
【问题描述】:

我有一个看起来像这样的系列:

146tf150p    1.000000
havent       1.000000
home         1.000000
okie         1.000000
thanx        1.000000
er           1.000000
anything     1.000000
lei          1.000000
nite         1.000000
yup          1.000000
thank        1.000000
ok           1.000000
where        1.000000
beerage      1.000000
anytime      1.000000
too          1.000000
done         1.000000
645          1.000000
tick         0.980166
blank        0.932702
dtype: float64

我想按价值排序,但也按索引排序。所以我会在顶部有最小的数字,但要尊重索引的字母顺序。

【问题讨论】:

    标签: python pandas sorting series


    【解决方案1】:

    使用np.lexsort获取有序位置并传递给iloc

    ser.iloc[np.lexsort([ser.index, ser.values])]
    
    blank        0.932702
    tick         0.980166
    146tf150p    1.000000
    645          1.000000
    anything     1.000000
    anytime      1.000000
    beerage      1.000000
    done         1.000000
    er           1.000000
    havent       1.000000
    home         1.000000
    lei          1.000000
    nite         1.000000
    ok           1.000000
    okie         1.000000
    thank        1.000000
    thanx        1.000000
    too          1.000000
    where        1.000000
    yup          1.000000
    dtype: float64
    

    【讨论】:

    • @ayhan 啊,是的,稳定与不稳定排序。
    【解决方案2】:

    我想你可以先把这个系列转移到一个DataFrame中,其中的列是系列的索引和值。然后对 DataFrame 进行排序。要进行传输,只需调用本系列的reset_index 函数并设置drop=False,即可获得数据帧。

    这里是例子:

    In [38]: s
    Out[38]: 
    0
    146tf150p    1.000000
    havent       1.000000
    home         1.000000
    okie         1.000000
    thanx        1.000000
    er           1.000000
    anything     1.000000
    lei          1.000000
    nite         1.000000
    yup          1.000000
    thank        1.000000
    ok           1.000000
    where        1.000000
    beerage      1.000000
    anytime      1.000000
    too          1.000000
    done         1.000000
    645          1.000000
    tick         0.980166
    blank        0.932702
    Name: 1, dtype: float64
    # drop=False, convert to a dataframe
    In [39]: df = s.reset_index(drop=False)
    # sorting by two columns, first 1 then 0
    In [40]: df.sort_values([1,0])
    Out[40]: 
                0         1
    19      blank  0.932702
    18       tick  0.980166
    0   146tf150p  1.000000
    17        645  1.000000
    6    anything  1.000000
    14    anytime  1.000000
    13    beerage  1.000000
    16       done  1.000000
    5          er  1.000000
    1      havent  1.000000
    2        home  1.000000
    7         lei  1.000000
    8        nite  1.000000
    11         ok  1.000000
    3        okie  1.000000
    10      thank  1.000000
    4       thanx  1.000000
    15        too  1.000000
    12      where  1.000000
    9         yup  1.000000
    # sorting by two columns, first 0 column then 1 column
    In [41]: df.sort_values([0, 1])
    Out[41]: 
                0         1
    0   146tf150p  1.000000
    17        645  1.000000
    6    anything  1.000000
    14    anytime  1.000000
    13    beerage  1.000000
    19      blank  0.932702
    16       done  1.000000
    5          er  1.000000
    1      havent  1.000000
    2        home  1.000000
    7         lei  1.000000
    8        nite  1.000000
    11         ok  1.000000
    3        okie  1.000000
    10      thank  1.000000
    4       thanx  1.000000
    18       tick  0.980166
    15        too  1.000000
    12      where  1.000000
    9         yup  1.000000
    

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 2019-06-29
      • 2020-10-20
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2013-12-15
      • 2014-05-24
      相关资源
      最近更新 更多