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

我知道我必须在datetime标头上调用day_name((方法,我可以这样做,我试图在列上迭代并找到这样做的方法,但没有成功。

此外,如果不可能做到这一点,那么任何其他想法都是受欢迎的。

如有任何帮助,我们将不胜感激。

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

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

最新更新