我有以下DataFrame:
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。
答案 0 :(得分:3)
使用:
Code
转换为每组list
DataFrame
contructor rename
列index
的列的reset_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()
替代:
Counter
按cumcount
创建系列,添加1
,投放到string
并从radd
右侧添加set_index
按列和Series
unstack
index
的列的reset_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