我有一个数据框:
df = pd.DataFrame({
'1Q18': [ 1500, 1200, 950, 2200],
'2Q18': [ 2340, 1234, 2000, 1230],
'3Q18': [2130, 2200, 2190, 2210],
'FY18': [1000, 1900, 1500, 1800],
'1Q19': [ 1500, 1200, 950, 2200],
'2Q19': [ 1500, 1200, 950, 2200],
'3Q19': [ 1500, 1200, 950, 2200],
'FY19': [ 1500, 1200, 950, 2200]})
我想以日期时间格式(季度和年份)制作标题,以便我可以对标题进行排序。我还想将所有列与季度数据合并在一起,以便数据框从左到右首先包含季度数据,然后是年度数据。结果应该如下所示:
df = pd.DataFrame({
'1Q18': [ 1500, 1200, 950, 2200],
'2Q18': [ 2340, 1234, 2000, 1230],
'3Q18': [2130, 2200, 2190, 2210],
'1Q19': [ 1500, 1200, 950, 2200],
'2Q19': [ 1500, 1200, 950, 2200],
'3Q19': [ 1500, 1200, 950, 2200],
'FY18': [1000, 1900, 1500, 1800],
'FY19': [ 1500, 1200, 950, 2200]})
首先,您需要将标题更改为日期时间格式。由于 pandas 不直接支持季度和年份,因此您可以将 '1Q18' 更改为 '2018Q1',然后将其转换为日期时间格式。 “FY18”可以被视为“2018Q4”,因此是“4Q18”。以下是您可以执行此操作的方法:
df.columns = pd.to_datetime(df.columns.str.replace('(Q\d)(\d{2})', r'20\2\1'), format='%YQ%q')
这行代码使用正则表达式将列名称重新格式化为 pandas 可以理解的格式,然后将它们转换为日期时间。
然后,您需要按升序对列进行排序:
df = df.sort_index(axis=1)
最后,您需要将数据框拆分为两部分,一份为季度数据,一份为年度数据,然后再次将它们连接起来:
quarter_cols = [col for col in df.columns if col.month != 12]
year_cols = [col for col in df.columns if col.month == 12]
df = pd.concat([df[quarter_cols], df[year_cols]], axis=1)