【问题标题】:"Group" rows based on one column, then create new columns for the possible combinations of existing other columns' values基于一列“分组”行,然后为现有其他列值的可能组合创建新列
【发布时间】:2021-10-12 23:36:06
【问题描述】:

我有一个如下形式的数据框:

date I1 I2 F1 F2
1 1 A v1 v9
1 1 B v2 v10
1 10 A v3 v11
1 10 B v4 v12
2 1 A v5 v13
2 1 B v6 v14
2 10 A v7 v15
2 10 B v8 v16

我想根据来自“I1”和“I2”的值的可能组合创建新列,并将相应的值全部放在一行中(对于同一日期)。生成的数据框应如下所示(按列的顺序排列,这无关紧要,我只是出于可视化目的选择了一个):

date F1-1-A F1-1-B F1-10-A F1-10-B F2-1-A F2-1-B F2-10-A F2-10-B
1 v1 v2 v3 v4 v9 v10 v11 v12
2 v5 v6 v7 v8 v13 v14 v15 v16

在 pandas 中实现这一目标的最简洁和通用的方法是什么?

【问题讨论】:

  • 你尝试了什么?
  • @sammywemmy 我尝试在日期上使用.groupby(),但未能为.agg(f).apply(f) 提供相应的f,这将实现我想要的。具体来说,我不知道如何以一次创建多个列的方式“折叠”原始数据框。我习惯了df['new'] = df.groupby(...).agg(...)

标签: python pandas


【解决方案1】:

您正在寻找一个支点。完成此操作后,您将需要加入多索引列名称以将其展平。

df = df.pivot(index='date',columns=['I1','I2'], values=['F1','F2'])
df.columns = ['-'.join(map(str,x)) for x in df.columns]
df.reset_index(inplace=True)

输出

   date F1-1-A F1-1-B F1-10-A F1-10-B F2-1-A F2-1-B F2-10-A F2-10-B
0     1     v1     v2      v3      v4     v9    v10     v11     v12
1     2     v5     v6      v7      v8    v13    v14     v15     v16

【讨论】:

    【解决方案2】:

    @Chris' solution 效果很好;使用pyjanitor 中的pivot_wider 可以进行一些抽象,以展平列(或根据需要进行一些其他操作):

    #pip install git+https://github.com/pyjanitor-devs/pyjanitor.git
    import pandas as pd
    import janitor
    df.pivot_wider(index='date', names_from=['I1', 'I2'], names_sep='-')
    
       date F1-1-A F1-1-B F1-10-A F1-10-B F2-1-A F2-1-B F2-10-A F2-10-B
    0     1     v1     v2      v3      v4     v9    v10     v11     v12
    1     2     v5     v6      v7      v8    v13    v14     v15     v16
    

    请注意,仅当索引和列的组合是唯一的时,pivot 才有效;如果不是,更好的选择是pivot_table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多