给出此数据框:
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之类的排序功能,但可以按值预先定义排序顺序?
答案 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