Pivot - 通过重复 pandas 数据框转置列
Pivot - Transpose columns by duplicates pandas dataframe
我有一个 DataFrame,其中包含一个名为 'ID' 的列,该列具有重复的观察值。每个 'ID' 行都有一个或多个 'Article' 值列。我想通过 'ID' 在唯一 'ID' 的同一行添加新列来转置整个数据帧分组。
我有:
ID Article_1 Article_2
1 Banana Coconut
2 Apple Strawberry
1 Apple
3 Tomatoe
1 Pineapple
2 Banana
4 Apple
5 Apple Strawberry
3 Apple
我想要的:
ID Article_1 Article_2 Article_3 Article_4
0001 Banana Coconut Apple Pineapple
0002 Apple Strawberry Banana NaN
0003 Tomatoe Apple NaN NaN
0004 Apple NaN NaN NaN
0005 Apple Strawberry NaN NaN
新编辑:
我遇到过一些顺序很重要的情况。
我的东风:
ID Article Article_2
1 Banana NaN
2 Apple NaN
1 Apple Coconut
3 Tomatoe Coconut
1 Pineapple Tropical
2 Banana Coconut
4 Apple Coconut
5 Apple Coconut
3 Apple Pineapple
第一个@Erfan 解决方案的输出:
Article_1 Article_2 Article_3 Article_4 Article_5 Article_6
0001 Banana Apple Pineapple NaN Coconut Tropical
0002 Apple Banana NaN Coconut NaN NaN
0003 Tomatoe Apple Coconut Pineapple NaN NaN
0004 Apple Coconut NaN NaN NaN NaN
0005 Apple Coconut NaN NaN NaN NaN
我需要什么:
Article_1 Article_2 Article_3 Article_4 Article_5 Article_6
0001 Banana Apple Pineapple Coconut Tropical NaN
0002 Apple Banana Coconut NaN NaN NaN
0003 Tomatoe Apple Coconut Pineapple NaN NaN
0004 Apple Coconut NaN NaN NaN NaN
0005 Apple Coconut NaN NaN NaN NaN
我不能让 Article_5 具有 NaN 值,而 Article_6 具有同一行的值。
如果文章的顺序不重要,我们可以使用 DataFrame.melt
将您的文章反透视到行。
然后我们用DataFrame.pivot_table
聚合到每个ID
。虽然我们使用 GroupBy.cumcount
为 ID
中的每个 article
提供唯一标识符:
dfn = df.melt(id_vars='ID', value_vars=['Article_1', 'Article_2'])
dfn = dfn.pivot_table(index='ID',
columns=dfn.groupby('ID')['value'].cumcount().add(1),
values='value',
aggfunc='first').add_prefix('Article_').rename_axis(None, axis='index')
Article_1 Article_2 Article_3 Article_4
0001 Banana Apple Pineapple Coconut
0002 Apple Banana Strawberry NaN
0003 Tomatoe Apple NaN NaN
0004 Apple NaN NaN NaN
0005 Apple Strawberry NaN NaN
我有一个 DataFrame,其中包含一个名为 'ID' 的列,该列具有重复的观察值。每个 'ID' 行都有一个或多个 'Article' 值列。我想通过 'ID' 在唯一 'ID' 的同一行添加新列来转置整个数据帧分组。
我有:
ID Article_1 Article_2
1 Banana Coconut
2 Apple Strawberry
1 Apple
3 Tomatoe
1 Pineapple
2 Banana
4 Apple
5 Apple Strawberry
3 Apple
我想要的:
ID Article_1 Article_2 Article_3 Article_4
0001 Banana Coconut Apple Pineapple
0002 Apple Strawberry Banana NaN
0003 Tomatoe Apple NaN NaN
0004 Apple NaN NaN NaN
0005 Apple Strawberry NaN NaN
新编辑:
我遇到过一些顺序很重要的情况。
我的东风:
ID Article Article_2
1 Banana NaN
2 Apple NaN
1 Apple Coconut
3 Tomatoe Coconut
1 Pineapple Tropical
2 Banana Coconut
4 Apple Coconut
5 Apple Coconut
3 Apple Pineapple
第一个@Erfan 解决方案的输出:
Article_1 Article_2 Article_3 Article_4 Article_5 Article_6
0001 Banana Apple Pineapple NaN Coconut Tropical
0002 Apple Banana NaN Coconut NaN NaN
0003 Tomatoe Apple Coconut Pineapple NaN NaN
0004 Apple Coconut NaN NaN NaN NaN
0005 Apple Coconut NaN NaN NaN NaN
我需要什么:
Article_1 Article_2 Article_3 Article_4 Article_5 Article_6
0001 Banana Apple Pineapple Coconut Tropical NaN
0002 Apple Banana Coconut NaN NaN NaN
0003 Tomatoe Apple Coconut Pineapple NaN NaN
0004 Apple Coconut NaN NaN NaN NaN
0005 Apple Coconut NaN NaN NaN NaN
我不能让 Article_5 具有 NaN 值,而 Article_6 具有同一行的值。
如果文章的顺序不重要,我们可以使用 DataFrame.melt
将您的文章反透视到行。
然后我们用DataFrame.pivot_table
聚合到每个ID
。虽然我们使用 GroupBy.cumcount
为 ID
中的每个 article
提供唯一标识符:
dfn = df.melt(id_vars='ID', value_vars=['Article_1', 'Article_2'])
dfn = dfn.pivot_table(index='ID',
columns=dfn.groupby('ID')['value'].cumcount().add(1),
values='value',
aggfunc='first').add_prefix('Article_').rename_axis(None, axis='index')
Article_1 Article_2 Article_3 Article_4
0001 Banana Apple Pineapple Coconut
0002 Apple Banana Strawberry NaN
0003 Tomatoe Apple NaN NaN
0004 Apple NaN NaN NaN
0005 Apple Strawberry NaN NaN