【问题标题】:How do you create a pivot table with a limited number of new columns using pandas?如何使用 pandas 创建具有有限数量新列的数据透视表?
【发布时间】:2021-10-13 12:04:06
【问题描述】:

我有这个数据框,例如:

emp_id label
a1 101
a1 102
a1 103
a1 104
a2 420
a2 17
a3 99
a3 100
a3 101

我想创建一个新的数据框,它就像一个数据透视表,其中列数是固定的,并且任何超过该限制的行都会被删除。

例如,如果我的列限制为 3,我想要的输出数据框将是:

emp_id label_1 label_2 label_3
a1 101 102 103
a2 420 17 NaN
a3 99 100 101

a1 的第 4 个条目被删除,a2 的第 3 个条目是 NaN

我怎样才能达到这个结果?

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    类似的方法,我们可以使用groupby cumcount 枚举emp_id,并使用pivot_table 转到宽格式,但根据指定的限制过滤组。然后使用Index.map格式化列标题:

    # Set limit
    limit = 3
    # Create Groups
    groups = df.groupby('emp_id').cumcount() + 1
    # Pivot to wide format with new columns
    df = df.pivot_table(index='emp_id',
                        columns=groups[groups.le(limit)],  #  Limit groups
                        values='label')
    # Update Column Labels
    df.columns = df.columns.map('label_{:.0f}'.format)
    # Reset Index
    df = df.reset_index()
    

    df:

      emp_id  label_1  label_2  label_3
    0     a1    101.0    102.0    103.0
    1     a2    420.0     17.0      NaN
    2     a3     99.0    100.0    101.0
    

    DataFrame 和导入:

    import pandas as pd
    
    df = pd.DataFrame({
        'emp_id': ['a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a3', 'a3', 'a3'],
        'label': [101, 102, 103, 104, 420, 17, 99, 100, 101]
    })
    

    【讨论】:

      【解决方案2】:

      您可以按 emp_id 分组并使用 cumcount:

      df['group'] = df.groupby('emp_id').cumcount().add(1)
      

      现在您应该有一个新列,其中包含用作枢轴的名称。您可以只保留您想要的标签并执行数据透视。

      类似:

      df = df[df['group'].le(3)]
      df.pivot(index='emp_id', columns='group', values='label')
      df.columns = df.columns.astype(str).add_prefix('label_')
      df = df.reset_index()
      

      注意。我无法测试代码

      【讨论】:

      • 这个答案有一些问题。如果没有类型转换,您不能将字符串连接到整数。你在 cumcount 之后缺少(),因为它是一个函数df['group'] = 'label_' + df.groupby('emp_id').cumcount().add(1).astype(str)。您的支点缺少index.le('label_3') 也很危险,因为这是字典顺序,无法很好地处理 10、11 之类的值,因为按字母顺序排列的顺序是 label_1、label_10、label_11、label_2、label_3、label_4。我认为这不是预期的行为。
      • 对不起,我的手机连接有限,我试图提供一个最低限度的答案来帮助 OP。如果您愿意,请随时更新我的​​帖子。
      • @Henry 希望修复大部分问题,在手机上输入代码的噩梦!
      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多