Используйте pivot
, замените отсутствующие значения и приведите к целым числам или set_index
на unstack
:
df1 = df.pivot('Name','TagID','Key').fillna(0).astype(int)
#alternative
#df1 = df.set_index(['Name','TagID'])['Key'].unstack(fill_value=0)
print (df1)
TagID 101 132 160 165 200 285 334 1123 1601 1617 1991 7075
Name
a 0 0 0 0 1 1 0 0 0 0 0 0
b 0 0 0 0 1 1 1 0 0 0 0 0
c 0 0 0 0 0 1 0 1 0 0 0 0
РЕДАКТИРОВАТЬ: Если get:
ValueError: Индекс содержит повторяющиеся записи, не может изменить форму
, это означает, что дубликаты в Name
и TagID
, поэтому необходимо агрегировать max
:
df2 = df.groupby(['Name','TagID'])['Key'].max().unstack(fill_value=0)
#alternative
df2 = df.pivot_table(index='Name',
columns='TagID',
values='Key',
fill_value=0,
aggfunc='max')
print (df2)
TagID 101 132 160 165 200 285 334 1123 1601 1617 1991 7075
Name
a 0 0 0 0 1 1 0 0 0 0 0 0
b 0 0 0 0 1 1 1 0 0 0 0 0
c 0 0 0 0 0 1 0 1 0 0 0 0