给定两列,如何将多行合并为一行?

How to merge multiple row into one row given two column?

假设我们有如下数据框。

   ID  time   feature1   feature2  feature3
0   1   1      10.2        2.3        60
1   2   3       8.9        -1.2       90
3   1   3       3.9        6.2        80

我想将每个ID对应的所有行合并为一行,特征名称被时间列修改。比如我们以ID = 1为例

Before merge:

   ID  time   feature1   feature2  feature3
0   1   1      10.2        2.3        60
3   1   3       3.9        6.2        80

After merge:

   ID  feature1_1  feature2_1  feature3_1  feature1_3  feature2_3  feature3_1
0   1    10.2         2.3          60         3.9         6.2          80

其中一个问题是,对于时间列,可以说完整的集合是 [1, 3, 5, 7, 9]。但是,对于每个 ID,它可能仅包含 [1, 3, 5, 7, 9] 的子集,例如 [1, 3, 5]

所以最终结果如下

   ID  feature1_1  feature2_1  feature3_1  feature1_3  feature2_3  feature3_3
0   1    10.2         2.3          60         3.9         6.2          80
...
1  168    8.7         6.2          45         NaN         NaN          NaN

您可以使用 melt 展平您的数据框,然后处理数据,最后使用 pivot:

重塑您的数据框
rename_feature = lambda x: x['feature'] + '_' + x.groupby(['ID', 'feature']).cumcount().add(1).astype(str)

out = (df.melt(['ID', 'time'], var_name='feature')
         .assign(feature=rename_feature)
         .pivot('ID', 'feature', 'value')
         .reset_index().rename_axis(columns=None))

输出:

>>> out
   ID  feature1_1  feature1_2  feature2_1  feature2_2  feature3_1  feature3_2
0   1        10.2         3.9         2.3         6.2        60.0        80.0
1   2         8.9         NaN        -1.2         NaN        90.0         NaN