您可以使用set_index
與cumcount
每團體計數新列的名稱和unstack
重塑,最後重命名列:
df = (df.set_index(['id', df.groupby('id').cumcount()])['name']
.unstack(fill_value=0)
.rename(columns = lambda x: 'n{}'.format(x + 1))
.reset_index())
print (df)
id n1 n2 n3 n4
0 1 abc qwe zxc 0
1 2 sdf wed abc mnb
與DataFrame
構造解決方案,是必要的沒有NaN值以原始數據:
df1 = df.groupby('id')['name'].apply(list)
print (df1)
id
1 [abc, qwe, zxc]
2 [sdf, wed, abc, mnb]
Name: name, dtype: object
df = (pd.DataFrame(df1.values.tolist(), index=df1.index)
.fillna(0)
.rename(columns = lambda x: 'n{}'.format(x + 1))
.reset_index())
print (df)
id n1 n2 n3 n4
0 1 abc qwe zxc 0
1 2 sdf wed abc mnb
和解決方案與GroupBy.apply
和Series
構造:
df1 = (df.groupby('id')['name'].apply(lambda x: pd.Series(x.values, index=range(1,len(x)+1)))
.unstack(fill_value=0)
.add_prefix('n')
.reset_index())
print (df1)
id n1 n2 n3 n4
0 1 abc qwe zxc 0
1 2 sdf wed abc mnb