首页 > 解决方案 > Pandas:在列标题中根据日期在顶部添加一行

问题描述

我有一个 DataFrame 数据透视表,其中日期作为列标题,如下所示:

Due Date    2020-01-1   2020-04-12  2020-04-22  2020-05-06  2020-05-1
Customer                                            
Aviva          0            0           0           0         1000  
Debenhams      0        75325           0           0           0   
H&M         1204            0           0           0           0

我想在标题下方添加一行,其中星期几对应于标题的日期:

    Due Date    2020-01-1   2020-04-12  2020-04-22  2020-05-06  2020-05-1
    Day         Wednesday     Sunday    Wednesday    Wednesday    Friday
    Customer                                            
    Aviva          0            0           0           0         1000  
    Debenhams      0        75325           0           0           0   
    H&M         1204            0           0           0           0

我知道我必须在我可以做的日期时间标题上调用 day_name() 方法,我尝试遍历列并找到一种方法来做到这一点,但没有运气。

此外,如果不可能完全以这种方式获得它,那么欢迎任何其他想法。

任何帮助将不胜感激。

标签: pythonpandasdataframedatetime

解决方案


您可以通过以下创建的第二级创建 MultiIndex DatetimeIndex.day_name

df.columns = [df.columns, pd.to_datetime(df.columns).day_name()]

print (df)
          2020-01-1 2020-04-12 2020-04-22 2020-05-06 2020-05-1
          Wednesday     Sunday  Wednesday  Wednesday    Friday
Due Date                                                      
Aviva             0          0          0          0      1000
Debenhams         0      75325          0          0         0
H&M            1204          0          0          0         0

如果还想设置列名,请使用MultiIndex.from_arrays

df.columns = pd.MultiIndex.from_arrays([df.columns, 
                                        pd.to_datetime(df.columns).day_name()], 
                                        names=('Date','Day'))

print (df)
Date      2020-01-1 2020-04-12 2020-04-22 2020-05-06 2020-05-1
Day       Wednesday     Sunday  Wednesday  Wednesday    Friday
Due Date                                                      
Aviva             0          0          0          0      1000
Debenhams         0      75325          0          0         0
H&M            1204          0          0          0         0

编辑:

如果可能的话,列中的一些非日期时间值:

df['sum'] = df.sum(axis=1)
df.columns = [df.columns, pd.to_datetime(df.columns, errors='coerce').day_name().fillna('-')]

print (df)
          2020-01-1 2020-04-12 2020-04-22 2020-05-06 2020-05-1    sum
          Wednesday     Sunday  Wednesday  Wednesday    Friday      -
Due Date                                                             
Aviva             0          0          0          0      1000   1000
Debenhams         0      75325          0          0         0  75325
H&M            1204          0          0          0         0   1204

推荐阅读