如何排序pandas数据帧非词法?

时间:2016-06-14 06:41:05

标签: sorting pandas lexical

我在以下数据框中对df.sort_values('credit', ascending=False, inplace=True) 进行排序的方法是使用sort_values()函数(我也尝试过sort()):

                i    credit           m  reg_date          b      id
----------------------------------------------------------------------
238             0   4600000.00        0  2014-04-14      False  102214   
127             0   4600000.00        0  2014-12-30      False  159479   
13              0  16800000.00        0  2015-01-12      False  163503   
248             0  16720000.00        0  2012-11-11      False    5116

问题在于学分如下所示:

False

升序为4600000.00,这就是16800000.00在其他学分之前的原因。但这不是我想要的。我想根据价值观进行排序。因此,上面的示例16720000.004600000.00应该在120 0 16708000.00 0 2013-12-17 False 51433 248 0 16720000.00 0 2012-11-11 False 5116 13 0 16800000.00 0 2015-01-12 False 163503 21 0 4634000.00 0 2014-12-29 False 159239 136 0 4650000.00 0 2012-11-07 False 4701 .. ... ... ... ... ... ... 231 0 7715000.00 0 2014-02-15 False 83936 182 0 7750000.00 0 2015-07-13 False 201584 之前。如何对这个Dataframe进行非词汇排序?

修改-1:
数据不仅如此,还可以包含:

maritalStatusOptions = [
        {"option": "Marital Status" },
        {"option": "Divorced" },
        {"option": "Married/Domestic Partner" },
        {"option": "Seperated" },
        {"option": "MI" },
        {"option": "Single" },
        {"option": "Widowed" }
    ];

1 个答案:

答案 0 :(得分:1)

您可以将列分类为float类型,并使用索引对原始索引进行切片

在你的情况下:

import pandas as pd
from StringIO import StringIO

text = """136             0   4650000.00        0  2012-11-07      False    4701
231             0   7715000.00        0  2014-02-15      False   83936
13              0  16800000.00        0  2015-01-12      False  163503
120             0  16708000.00        0  2013-12-17      False   51433
248             0  16720000.00        0  2012-11-11      False    5116
21              0   4634000.00        0  2014-12-29      False  159239
182             0   7750000.00        0  2015-07-13      False  201584
"""

df = pd.read_csv(StringIO(text), delim_whitespace=True,
                 header=None, index_col=0,
                 names=['i', 'credit', 'm', 'reg_date', 'b', 'id'])

print df.loc[df.credit.astype(float).sort_values(ascending=False).index]

     i      credit  m    reg_date      b      id
13   0  16800000.0  0  2015-01-12  False  163503
248  0  16720000.0  0  2012-11-11  False    5116
120  0  16708000.0  0  2013-12-17  False   51433
182  0   7750000.0  0  2015-07-13  False  201584
231  0   7715000.0  0  2014-02-15  False   83936
136  0   4650000.0  0  2012-11-07  False    4701
21   0   4634000.0  0  2014-12-29  False  159239