根据列名称中的子字符串重新排列Dataframe列

时间:2018-08-17 17:22:04

标签: python string sorting dataframe

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

季度是紧随当前季度的前四个季度(例如,如果当前季度= Q3 17,则测量的季度为Q3 16Q4 16Q1 17Q2 17 )。

Quarter      Q1 17   Q2 17  Q3 16  Q4 16
Character
Sonic         10.0   6.0    19.0    3.0
Shadow        5.0    5.0    7.0     23.0

我想以时间限制的方式Q3 16Q4 16Q1 17Q2 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]

由于该代码在一段时间内会定期使用,因此用户将根据使用该代码的时间来测量不同的季度。 (例如,当前季度是Q2 17,对于Q2-4 16和Q1 17将有三个16值和一个17中的sort_columns_years值。

sort_columns_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']

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

1 个答案:

答案 0 :(得分:1)

尽管我相信会有一些使用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