按特定顺序对Pandas DataFrame中的列进行排序

时间:2018-10-12 17:28:25

标签: python pandas

给出此数据框:

Row(
      children: <Widget>[
        Expanded(
          flex: 2, // 20%
          child: Container(color: Colors.red),
        ),
        Expanded(
          flex: 6, // 60%
          child: Container(color: Colors.green),
        ),
        Expanded(
          flex: 2, // 20%
          child: Container(color: Colors.blue),
        )
      ],
    )

我想按此顺序对A列进行排序:9月,8月,9月。是否可以使用诸如sort_values之类的排序功能,但可以按值预先定义排序顺序?

6 个答案:

答案 0 :(得分:8)

使用Categorical

df.A=pd.Categorical(df.A,categories=['July', 'August', 'Sept'])
df=df.sort_values('A')
df
Out[310]: 
        A  B
1    July  3
0  August  2
2    Sept  6

答案 1 :(得分:2)

在字典中定义顺序并根据其排序

sort_dict = {'July':0,'August':1,'Sept':2}
df.iloc[df['A'].map(sort_dict).sort_values().index]

输出

       A    B
1   July    3
0   August  2
2   Sept    6

答案 2 :(得分:2)

您反对使用完整的月份名称还是一致的缩写?

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])

df

import calendar

df = df.replace({'Sept':'September'})

calendar.month_name[1:]

输出:

['January',
 'February',
 'March',
 'April',
 'May',
 'June',
 'July',
 'August',
 'September',
 'October',
 'November',
 'December']

df['A'] = pd.Categorical(df.A, categories=calendar.month_name[1:], ordered=True)

df.sort_values('A')

输出:

           A  B
1       July  3
0     August  2
2  September  6

或使用calendar.month_abbr

calendar.month_abbr[1:]

输出:

['Jan',
 'Feb',
 'Mar',
 'Apr',
 'May',
 'Jun',
 'Jul',
 'Aug',
 'Sep',
 'Oct',
 'Nov',
 'Dec']

答案 3 :(得分:1)

您可以分配自己的值以对列进行排序,然后对这些值进行排序,然后将其删除:

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])
value_map = {'August': 1, 'July': 0, 'Sept': 2}
def sort_by_key(df, col, value_map):
    df = df.assign(sort = lambda df: df[col].map(value_map))
    return df.sort_values('sort') \
             .drop('sort', axis='columns')

sort_by_key(df, 'A', value_map)

结果:

        A  B
1    July  3
0  August  2
2    Sept  6

答案 4 :(得分:1)

临时将str月份转换为日期时间并进行排序

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])
df['tmp'] = pd.to_datetime(df['A'].str[:3], format='%b').dt.month
df.sort_values(by = ['tmp']).drop('tmp', 1)


    A       B
1   July    3
0   August  2
2   Sept    6

答案 5 :(得分:1)

我将您的“ 9月”更改为“ 9月”,以使其与其他月份的命名约定保持一致。

然后我用pd.date_range列出了月份名称的有序列表。

将列表中的值除以您的值(保留正确的月顺序)。

使用该子列表进行分类,然后对这些值进行排序

import pandas as pd


df = pd.DataFrame([['August', 2], ['July', 3], ['September', 6]], columns=['A', 'B'])

full_month_list = pd.date_range('2018-01-01','2019-01-01', freq='MS').strftime("%B").tolist()
partial_month_list = [x for x in month_list if x in df['A'].values]
df['A'] = pd.Categorical(df['A'], partial_month_list)

df.sort_values('A')

结果:

    A           B
1   July        3
0   August      2
2   September   6