如何使用每行可变列大小来转换数据帧?

时间:2018-03-07 13:03:07

标签: python pandas

我有以下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。

1 个答案:

答案 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()

替代:

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