Python 基于列名中的子字符串重新排列数据帧列

Python 基于列名中的子字符串重新排列数据帧列,python,string,sorting,dataframe,Python,String,Sorting,Dataframe,我有一个数据框,df,它在一年中的几个季度中有两个字符的值。[Q1=1月、2月、3月;Q2=4月、5月、6月等] 季度是本季度之后的前四个季度(例如,如果本季度=2017年第三季度,则测量的季度为2016年第三季度、2016年第四季度、2017年第一季度、2017年第二季度) 我想以时间应用的方式对列重新排序,Q3 16,Q4 16,Q1 17,Q2 17,以获得以下结果: Quarter Q3 16 Q4 16 Q1 17 Q2 17 Character Sonic

我有一个数据框,
df
,它在一年中的几个季度中有两个字符的值。[Q1=1月、2月、3月;Q2=4月、5月、6月等]

季度是本季度之后的前四个季度(例如,如果本季度=2017年第三季度,则测量的季度为2016年第三季度、2016年第四季度、2017年第一季度、2017年第二季度)

我想以时间应用的方式对列重新排序,
Q3 16
Q4 16
Q1 17
Q2 17
,以获得以下结果:

Quarter      Q3 16   Q4 16  Q1 17  Q2 17
Character
Sonic         19.0   3.0    10.0    6.0
Shadow        7.0    23.0   5.0     5.0
我考虑过按包含年份的子字符串进行排序。但是有没有更干净、更快的方法呢

[编辑] 为了澄清,我创建了今年的子字符串:

columns = list(scar_pivot.columns.values)
sort_columns_years = [int(c[3:5]) for c in columns]
sort_columns_years=
[17, 17, 16, 16]
由于该代码会随着时间的推移定期使用,因此用户将根据使用代码的时间测量不同的季度。(例如,当前季度为第二季度17,第二季度至第四季度16和第一季度17的
sort\u columns\u years
中有三个
16
值和一个
17

在对
sort\u columns\u years
进行排序后,我想我可以使用
count
来衡量存在多少较小的值,在前一年的三个季度中做一些事情,如下所示:

new_list = []
`if sort_columns_years.count(16) == 3:
     sort_quarters = ['Q2','Q3','Q4','Q1']
     for each in range(0,len(sort_quarters)):
        new_list.append(sort_column_years[each] + sort_column_years(sort_quarters[each]))
得到

new_list=['Q2 16'、'Q3 16'、'Q4 16'、'Q1 17']


但是我不知道如何避免硬编码
16
17

尽管我相信使用series或numpy会有一些方法 但是,如果您认为如果将年份组件置于四分之一之前(如
16Q1
),则排序将更容易且更有意义,则问题可以解决。以下是示例:

def restructure(l):
    temp_lis=[]
    for i in l:
        temp=i.split(" ")
        temp_lis.append(temp[1] +' '+temp[0] )
    return temp_lis

a=['Q1 17', 'Q2 17','Q3 16','Q4 16']
new_list=[]

new_list=sorted(restructure(a))
final=restructure(new_list)

print(final)
输出:

['Q3 16', 'Q4 16', 'Q1 17', 'Q2 17']
如果需要使用列定义df

df[[final]] # should be enough

@florence-y您的输出与输入不一致。我得到了您想要的。请编辑您的预期输出。
df[[final]] # should be enough