Первый фильтр только type
столбцы по DataFrame.filter
, изменение формы по DataFrame.stack
, поэтому возможен вызов Series.str.get_dummies
.Затем для вывода 0/1
используйте max
на первом уровне MultiIndex
и измените 1
на NaN
s на DataFrame.mask
.Последнее добавление первого столбца по DataFrame.join
:
df1 = df.filter(like='type').stack().str.get_dummies().max(level=0).mask(lambda x: x == 0)
Или использование get_dummies
и max
для имен столбцов и последнее изменение 1
в NaN
с:
df1 = (pd.get_dummies(df.filter(like='type'), prefix='', prefix_sep='')
.max(level=0, axis=1)
.mask(lambda x: x == 0))
df = df[['id']].join(df1)
print (df)
id cat cow dog
0 1 NaN NaN 1.0
1 2 1.0 NaN NaN
2 3 1.0 NaN 1.0
3 4 NaN 1.0 NaN
4 5 NaN NaN 1.0
5 6 1.0 NaN NaN
6 7 1.0 1.0 1.0
7 8 NaN NaN 1.0