Как изменить значения вложенного столбца в сводной таблице панд - PullRequest
1 голос
/ 19 сентября 2019

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

Нужно изменить значения подколонка Комментарий (если это> = 1, «Да», иначе «Нет»)

data_frame1 = pd.pivot_table(data_frame, index=['PC', 'Geo', 'Comp'], values=['Bill1', 'Bill2', 'Comment'], 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)

ВводКадр данных

PC Geo Comp  Month          Bill1 Bill2  Comment
A  Ind   OS  01/10/2019     1     1.28      1
A  Ind   OS  01/11/2019     1     1.28      2
A  Ind   OS  01/12/2019     1     1.28      0


выход

               OCT-19                  Nov-19               Dec-19
             Bill1 Bill2 comment   Bill1 Bill2 comment   Bill1 Bill2 comment     
PC Geo Comp
A  Ind   OS   1     1.28    1        1    1.28    2         1    1.28   0


желаемый выход

                   OCT-19               Nov-19              Dec-19
             Bill1 Bill2 Comment Bill1 Bill2 Comment Bill1 Bill2 Comment     
PC Geo Comp
A  Ind   OS   1     1.28    Yes     1    1.28  Yes        1    1.28 No

Ответы [ 2 ]

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

Перед выполнением любой операции с загруженным data_frame примените следующую функцию:

def change_comment(comment_value):
    if int(comment_value)>=1:
        return "Yes"
    return "No"

data_frame = data_frame[["comment"]].applymap(change_comment)

Надеюсь, это поможет !!!

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

Вы не можете изменить его до pivot_table, так как столбец удален.Причиной является агрегатная функция по умолчанию в pivot_table, которая mean работает только с числовыми значениями, поэтому все нечисловые столбцы удаляются.

Поэтому необходимо изменить ее после одного возможного решения с помощью numpy.where:

data_frame1 = pd.pivot_table(data_frame, index=['PC', 'Geo', 'Comp'], 
                             values=['Bill1', 'Bill2', 'Comment'], 
                             columns=['Month'], 
                             fill_value=0)

data_frame1 = data_frame1.swaplevel(0,1, axis=1).sort_index(axis=1)

mask = data_frame1.columns.get_level_values(1) == 'Comment'
data_frame1.loc[:, mask] = np.where(data_frame1.loc[:, mask] >= 1, 'Yes', 'No')
print (data_frame1)
Month       01/10/2019               01/11/2019               01/12/2019  \
                 Bill1 Bill2 Comment      Bill1 Bill2 Comment      Bill1   
PC Geo Comp                                                                
A  Ind OS            1  1.28     Yes          1  1.28     Yes          1   

Month                      
            Bill2 Comment  
PC Geo Comp                
A  Ind OS    1.28      No  
...