Как удалить вложенные столбцы из таблицы данных сводной таблицы - PullRequest
0 голосов
/ 24 сентября 2019

Необходимо удалить вложенный столбец многоиндексного фрейма данных, созданного из сводной таблицы

Необходимо удалить вложенный столбец только в определенных столбцах (месяце) динамически

У меня естьфрейм данных создан из сводной таблицы и должен динамически удалять вложенный столбец в определенных столбцах ...
если текущая дата меньше 15 мне нужно удалить вложенный столбец Bill1 за все месяцы после сентябрь 19 ( текущий месяц ) ( Bill1 будет присутствовать с января по сентябрь)
если сегодняшняя датабольше 15 , он должен опускать подколонку Bill1 для всех месяцев после Oct-19 ( в следующем месяце ) (Bill1 будет представлен с января по октябрь)

data_frame1 = pd.pivot_table(data_frame, index=['PC', 'Geo', 'Comp'], values=['Bill1', 'Bill2'], columns=['Month'], fill_value=0)
data_frame1 = data_frame1.swaplevel(0,1, axis=1).sort_index(axis=1)
tuples = [(a.strftime('%b-%y'), b) if a!= 'All' else (a,b) for a,b in data_frame1.columns]
data_frame1.columns = pd.MultiIndex.from_tuples(tuples)

выход:

              Aug-19             Sep-19        Oct-19
             Bill1 Bill2      Bill1 Bill2     Bill1 Bill2     
PC Geo Comp
A  Ind   OS   1     1.28        1    1.28      1    1.28

желаемый Выход:
если сегодняшняя дата меньше 15

               Aug-19          Sep-19        Oct-19
              Bill1  Bill2     Bill1 Bill2    Bill2     
PC Geo Comp
A  Ind   OS    1      1.28      1     1.28     1.28


, если сегодняшняя дата больше 15

                 Aug-19         Sep-19           Oct-19
               Bill1 Bill2   Bill1  Bill2     Bill1   Bill2     
PC Geo Comp
A  Ind   OS     1      1.28    1     1.28       1     1.28

1 Ответ

1 голос
/ 25 сентября 2019

Образец :

print (df)
         Aug-19       Sep-19       Oct-19       Nov-19      
          Bill1 Bill2  Bill1 Bill2  Bill1 Bill2  Bill1 Bill2
A Ind OS      1  1.28      1  1.28      1  1.28      1  1.28

#convert first level for datetimes and to month periods
level0 = pd.to_datetime(df.columns.get_level_values(0), format='%b-%y').to_period('m')
#get second level
level1 = df.columns.get_level_values(1)
#print (level0)

#print (level1)

#test for next 15 days
dat = pd.to_datetime('2019-09-05')
#get today timestamp
#dat = pd.to_datetime('now')
print (dat)

#convert timestamp to period
today_per = dat.to_period('m')

#compare day and filter
if dat.day < 15:
    df = df.loc[:, (level0 <= (today_per)) | (level1 != 'Bill1')]
else:
    #test with add 1 month to today period
    df = df.loc[:, (level0 <= today_per + 1) | (level1 != 'Bill1')]
print (df)
         Aug-19       Sep-19       Oct-19 Nov-19
          Bill1 Bill2  Bill1 Bill2  Bill2  Bill2
A Ind OS      1  1.28      1  1.28   1.28   1.28

#convert first level for datetimes and to month periods
level0 = pd.to_datetime(df.columns.get_level_values(0), format='%b-%y').to_period('m')
#get second level
level1 = df.columns.get_level_values(1)
#print (level0)

#print (level1)

#test for next 15 days
#dat = pd.to_datetime('2019-09-05')
#get today timestamp
dat = pd.to_datetime('now')
print (dat)

#convert timestamp to period
today_per = dat.to_period('m')

#compare day and filter
if dat.day < 15:
    df = df.loc[:, (level0 <= (today_per)) | (level1 != 'Bill1')]
else:
    #test with add 1 month to today period
    df = df.loc[:, (level0 <= today_per + 1) | (level1 != 'Bill1')]
print (df)
         Aug-19       Sep-19       Oct-19       Nov-19
          Bill1 Bill2  Bill1 Bill2  Bill1 Bill2  Bill2
A Ind OS      1  1.28      1  1.28      1  1.28   1.28
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...