按日期顺序重新排列Pandas DataFrame日期列

时间:2018-12-18 12:39:57

标签: python pandas

我有一个pandas数据框,可以按日历月汇总销售量,并输出以下内容:

Month   level_0 UNIQUE_ID   102018  112018  12018   122017  122018  22018   32018   42018   52018   62018   72018   82018   92018
0   SOLD_QUANTITY   01  3692.0  5182.0  3223.0  1292.0  2466.0  2396.0  2242.0  2217.0  3590.0  2593.0  1665.0  3371.0  3069.0
1   SOLD_QUANTITY   011 3.0 6.0 NaN NaN 7.0 5.0 2.0 1.0 5.0 NaN 1.0 1.0 3.0
2   SOLD_QUANTITY   02  370.0   130.0   NaN NaN 200.0   NaN NaN 269.0   202.0   NaN 201.0   125.0   360.0
3   SOLD_QUANTITY   03  2.0 6.0 NaN NaN 2.0 1.0 NaN 6.0 11.0    9.0 2.0 3.0 5.0
4   SOLD_QUANTITY   08  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 175.0   NaN NaN

我希望能够以编程方式以升序排列列标题(例如,从122017、12018、22018开始...)。我需要以编程方式来实现此目的,因为报告运行的每一种方式都将是不同的月份列表,因为过去365天每个月都会运行。

索引数据类型:

Index(['level_0', 'UNIQUE_ID', '102018', '112018', '12018', '122017', '122018',
       '22018', '32018', '42018', '52018', '62018', '72018', '82018', '92018'],
      dtype='object', name='Month')

1 个答案:

答案 0 :(得分:3)

仅将set_index用于date列,将它们转换为datetime并获得argsort的订单头寸,然后使用iloc更改顺序:< / p>

df = df.set_index(['level_0','UNIQUE_ID'])

df = df.iloc[:, pd.to_datetime(df.columns, format='%m%Y').argsort()].reset_index()
print (df)
         level_0  UNIQUE_ID  122017   12018   22018   32018   42018   52018  \
0  SOLD_QUANTITY          1  1292.0  3223.0  2396.0  2242.0  2217.0  3590.0   
1  SOLD_QUANTITY         11     NaN     NaN     5.0     2.0     1.0     5.0   
2  SOLD_QUANTITY          2     NaN     NaN     NaN     NaN   269.0   202.0   
3  SOLD_QUANTITY          3     NaN     NaN     1.0     NaN     6.0    11.0   
4  SOLD_QUANTITY          8     NaN     NaN     NaN     NaN     NaN     NaN   

    62018   72018   82018   92018  102018  112018  122018  
0  2593.0  1665.0  3371.0  3069.0  3692.0  5182.0  2466.0  
1     NaN     1.0     1.0     3.0     3.0     6.0     7.0  
2     NaN   201.0   125.0   360.0   370.0   130.0   200.0  
3     9.0     2.0     3.0     5.0     2.0     6.0     2.0  
4     NaN   175.0     NaN     NaN     NaN     NaN     NaN  

另一个想法是通过DatetimeIndex.to_period创建月份周期索引,因此可以使用sort_index

df = df.set_index(['level_0','UNIQUE_ID'])

df.columns = pd.to_datetime(df.columns, format='%m%Y').to_period('m')
#alternative for convert to datetimes
#df.columns = pd.to_datetime(df.columns, format='%m%Y')
df = df.sort_index(axis=1).reset_index()
print (df)
         level_0  UNIQUE_ID  2017-12  2018-01  2018-02  2018-03  2018-04  \
0  SOLD_QUANTITY          1   1292.0   3223.0   2396.0   2242.0   2217.0   
1  SOLD_QUANTITY         11      NaN      NaN      5.0      2.0      1.0   
2  SOLD_QUANTITY          2      NaN      NaN      NaN      NaN    269.0   
3  SOLD_QUANTITY          3      NaN      NaN      1.0      NaN      6.0   
4  SOLD_QUANTITY          8      NaN      NaN      NaN      NaN      NaN   

   2018-05  2018-06  2018-07  2018-08  2018-09  2018-10  2018-11  2018-12  
0   3590.0   2593.0   1665.0   3371.0   3069.0   3692.0   5182.0   2466.0  
1      5.0      NaN      1.0      1.0      3.0      3.0      6.0      7.0  
2    202.0      NaN    201.0    125.0    360.0    370.0    130.0    200.0  
3     11.0      9.0      2.0      3.0      5.0      2.0      6.0      2.0  
4      NaN      NaN    175.0      NaN      NaN      NaN      NaN      NaN