我有一个数据框df
,该数据框在一年的某个季度中具有两个字符的值。 [Q1 = 1月,2月,3月; Q2 = 4月,5月,6月...等。
季度是紧随当前季度的前四个季度(例如,如果当前季度= Q3 17,则测量的季度为Q3 16
,Q4 16
,Q1 17
,Q2 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 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]
由于该代码在一段时间内会定期使用,因此用户将根据使用该代码的时间来测量不同的季度。 (例如,当前季度是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']
但是我不知道如何避免硬编码16
或17
。
答案 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