我有以下数据框:
ID Code
5966856 A
5966856 B
5966857 A
5966854 A
5966854 B
5966854 C
6648070 A
6648074 A
6648075 B
我希望将其转换为:
ID Code_1 Code_2 Code_3
5966856 A B NaN
5966857 A NaN NaN
5966854 A B C
6648070 A NaN NaN
6648074 A NaN NaN
6648075 B NaN NaN
我尝试了 groupby 和 pivot,但无论哪种情况,我都需要定义列,在我的例子中,这些列是可变的。 最大列数等于每个唯一 ID 的最大代码数。对于其余部分,我填充为 NaN。
最佳答案
使用:
- 首先将列
代码
转换为列表
每组 - 然后使用
DataFrame
构造函数 通过自定义函数重命名
列-
reset_index
来自index
的列
a = df.groupby('ID')['Code'].apply(list)
c = lambda x: 'Code_{}'.format(x+1)
df = pd.DataFrame(a.values.tolist(), index=a.index).rename(columns=c).reset_index()
备选方案:
- 通过
cumcount
创建系列对于Counter
,添加1
,转换为string
并从右边radd
添加 -
set_index
按列和系列
- reshape
unstack
-
reset_index
来自index
的列
a = df.groupby('ID')['Code'].cumcount().add(1).astype(str).radd('Code_')
df = df.set_index(['ID', a])['Code'].unstack().reset_index()
print (df)
ID Code_1 Code_2 Code_3
0 5966854 A B C
1 5966856 A B None
2 5966857 A None None
3 6648070 A None None
4 6648074 A None None
5 6648075 B None None
关于python - 如何转换每行可变列大小的数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49152664/