【问题标题】:How to collapse/group columns in pandas如何折叠/分组熊猫中的列
【发布时间】:2020-04-20 13:03:18
【问题描述】:

我的数据列名称为天,最多 3000 列,值为 0/1,例如;

并且希望将列转换/分组为每周(第 1 周为 1-7 和第 2 周为 8-14),例如;

如果 1-7 之间的列至少有 1,那么 week_1 应该返回 1,否则返回 0。

【问题讨论】:

    标签: python pandas grouping multiple-columns collapse


    【解决方案1】:

    将第一列转换为索引,然后通过7 的整数除法创建的辅助数组聚合max 并添加1

    pd.options.display.max_columns = 30
    
    np.random.seed(2020)
    df = pd.DataFrame(np.random.choice([1,0], size=(5, 21), p=(0.1, 0.9)))
    df.columns += 1
    df.insert(0, 'id', 1000 + df.index)
    print (df)
         id  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  \
    0  1000  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   
    1  1001  0  0  0  0  0  1  0  0  0   0   0   0   0   0   0   0   0   0   0   
    2  1002  0  0  1  0  0  0  0  0  0   0   0   0   0   1   0   0   0   0   0   
    3  1003  0  0  1  0  0  0  0  0  0   0   1   0   0   0   0   1   0   0   0   
    4  1004  0  1  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   
    
       20  21  
    0   0   0  
    1   0   0  
    2   0   0  
    3   0   0  
    4   0   0  
    

    df = df.set_index('id')
    arr = np.arange(len(df.columns)) // 7 + 1
    df = df.groupby(arr, axis=1).max().add_prefix('week_').reset_index()
    

    print (df)
         id  week_1  week_2  week_3
    0  1000       0       0       0
    1  1001       1       0       0
    2  1002       1       1       0
    3  1003       1       1       1
    4  1004       1       0       0
    

    【讨论】:

      【解决方案2】:
      import pandas as pd
      import numpy as np
      
      id = list(range(1000, 1010))
      cl = list(range(1,22))
      data_ = np.random.rand(10,21)
      data_
      client_data = pd.DataFrame(data=data_, index=id, columns=cl)
      
      
      def change_col(col_hd=int):
          week_num = (col_hd + 6) // 7
          week_header = 'week_' + str(week_num)
          return week_header
      
      
      new_col_header = []
      for c in cl:
          new_col_header.append(change_col(c))
      
      client_data.columns = new_col_header
      
      client_data.columns.name = 'id'
      
      client_data.groupby(axis='columns', level=0).sum()
      

      【讨论】:

      • 创建了一个大小为 (10 x 21) 的虚拟数据并根据您的要求对其进行了修改,运行代码并检查
      猜你喜欢
      • 2015-12-01
      • 2019-10-28
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多