遍历每个数据框标头,并且仅当标头字符串中包含“ 20”时,才将int month更新为str month

时间:2019-05-23 00:28:14

标签: python pandas dataframe

一些需要更改df标头的Django格式问题。

测试数据:

Test_Data = [
                ('Year_Month', ['Done_RFQ','Not_Done_RFQ','Total_RFQ']),
                ('2018_11', [10, 20, 30]),
                ('2019_06',[10,20,30]),
                ('2019_12', [40, 50, 60]),
             ]

df = pd.DataFrame(dict(Test_Data))
print(df)

     Year_Month  2018_11  2019_06  2019_12
0      Done_RFQ       10       10       40
1  Not_Done_RFQ       20       20       50
2     Total_RFQ       30       30       60

所需的输出:

     Year_Month  2018_Nov  2019_Jun  2019_Dec
0      Done_RFQ        10        10        40
1  Not_Done_RFQ        20        20        50
2     Total_RFQ        30        30        60

我的尝试

df_names = df.columns
for df_name in df_names:
    if df_name[:1] == '20':
        df.df_name = str(pd.to_datetime(df_name, format='%Y_%m').dt.strftime('%Y_%b'))

错误:AttributeError: 'Timestamp' object has no attribute 'dt'

我希望date对象可以用于格式化。是否有关于如何针对标头中的任何字符串通用化的建议?

2 个答案:

答案 0 :(得分:1)

IIUC

s=pd.Series(df.columns)
s2=pd.to_datetime(s,format='%Y_%m',errors ='coerce').dt.strftime('%Y_%b')
df.columns=s2.mask(s2=='NaT').fillna(s)
df
Out[368]: 
   2018_Nov  2019_Jun  2019_Dec    Year_Month
0        10        10        40      Done_RFQ
1        20        20        50  Not_Done_RFQ
2        30        30        60     Total_RFQ

答案 1 :(得分:1)

您可以删除.dt,因为.strftime是Timestamp的一种方法:

df.df_name = str(pd.to_datetime(df_name, format='%Y_%m').strftime('%Y_%b'))