【问题标题】:How to change the values of a sub column in a pandas pivot table如何更改熊猫数据透视表中子列的值
【发布时间】:2019-09-19 12:35:23
【问题描述】:

我有一个数据透视表数据框,我需要更改数据框子列的值

需要改变子栏Comment的值(如果>=1,'Yes',否则'No')

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

【问题讨论】:

    标签: python-3.x pandas pivot-table


    【解决方案1】:

    您不能在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  
    

    【讨论】:

      【解决方案2】:

      在对加载的 data_frame 进行任何操作之前,应用以下函数:

      def change_comment(comment_value):
          if int(comment_value)>=1:
              return "Yes"
          return "No"
      
      data_frame = data_frame[["comment"]].applymap(change_comment)
      

      希望对你有帮助!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        • 2023-01-11
        • 2023-03-11
        相关资源
        最近更新 更多