给定两列,如何将多行合并为一行?
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
假设我们有如下数据框。
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