Заголовки Df: вставьте полный год строк заголовков в конце месяца и заполните нулевые месяцы нулями - PullRequest
1 голос
/ 23 мая 2019

Все днем,

Данные испытаний по состоянию на 30 марта 2019 года:

Test_Data = [
                ('Index', ['Year_Month','Done_RFQ','Not_Done_RFQ','Total_RFQ']),
                ('0', ['2019-01',10,20,30]),
                ('1', ['2019-02', 10, 20, 30]),
                ('2', ['2019-03', 20, 40, 60]),
             ]

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

          Index        0        1        2
0    Year_Month  2019-01  2019-02  2019-03
1      Done_RFQ       10       10       20
2  Not_Done_RFQ       20       20       40
3     Total_RFQ       30       30       60

Требуемый выход по состоянию на 31 марта 2019 г.

enter image description here

Желаемый результат на 30 апреля 2019 года

enter image description here

С каждым месяцем у неформатированного df будет дополнительный столбец данных

Я бы хотел:

а. Замените заголовки в существующем df, обратите внимание, что в марте будет только четыре столбца, а в апреле - 5 .... 13 декабря:

df.columns = ['Report_Mongo','Month_1','Month_2','Month_3','Month_4','Month_5','Month_6','Month_7','Month_8','Month_9','Month_10','Month_11','Month_12']

б. По мере прохождения года нулевые значения будут заменены данными. Задача состоит в том, чтобы определить, сколько месяцев прошло, и обновлять только незаполненные столбцы данными

1 Ответ

1 голос
/ 23 мая 2019

Вы можете назначить столбцы по длине исходных столбцов и DataFrame.reindex:

c = ['Report_Mongo','Month_1','Month_2','Month_3','Month_4','Month_5','Month_6',
     'Month_7','Month_8','Month_9','Month_10','Month_11','Month_12']

df.columns = c[:len(df.columns)]
df = df.reindex(c, axis=1, fill_value=0)
print (df)
   Report_Mongo  Month_1  Month_2  Month_3  Month_4  Month_5  Month_6  \
0    Year_Month  2019-01  2019-02  2019-03        0        0        0   
1      Done_RFQ       10       10       20        0        0        0   
2  Not_Done_RFQ       20       20       40        0        0        0   
3     Total_RFQ       30       30       60        0        0        0   

   Month_7  Month_8  Month_9  Month_10  Month_11  Month_12  
0        0        0        0         0         0         0  
1        0        0        0         0         0         0  
2        0        0        0         0         0         0  
3        0        0        0         0         0         0  

Альтернативой является создание заголовка с периодами месяцев, преимуществом являются только числовые данные во всех строках:

#set columns by first row
df.columns = df.iloc[0]
#remove first row and create index by first column
df = df.iloc[1:].set_index('Year_Month')
#convert columns to month periods 
df.columns = pd.to_datetime(df.columns).to_period('m')
#reindex to full year
df = df.reindex(pd.period_range(start='2019-01',end='2019-12',freq='m'),axis=1,fill_value=0)
print (df)
             2019-01 2019-02 2019-03  2019-04  2019-05  2019-06  2019-07  \
Year_Month                                                                 
Done_RFQ          10      10      20        0        0        0        0   
Not_Done_RFQ      20      20      40        0        0        0        0   
Total_RFQ         30      30      60        0        0        0        0   

              2019-08  2019-09  2019-10  2019-11  2019-12  
Year_Month                                                 
Done_RFQ            0        0        0        0        0  
Not_Done_RFQ        0        0        0        0        0  
Total_RFQ           0        0        0        0        0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...