Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
259 views
in Technique[技术] by (71.8m points)

sorting - How to sort pandas dataframe non-lexical?

What I do to sort credit in the following dataframe is to use sort_values() function (I've also tried sort()):

df.sort_values('credit', ascending=False, inplace=True)

The problem is that credits are sorted like below:

                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

Ascending is False that's why 4600000.00 is before other credits. But this is not what I wanted. I wanted to sort based on the values. So in the sample above 16800000.00 and 16720000.00 should be before 4600000.00. How to sort this Dataframe non-lexical?

EDIT-1:
Data is more than that and can contain:

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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You could sort the column separately as type float and use the index to slice the original index

In your case:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...