Вы можете сгладить столбцы до DataFrame
:
from itertools import chain
d = df['Data'].str.split(',')
isdef = df['IsDef'].str.split(',')
df = pd.DataFrame({
'Data' : list(chain.from_iterable(d)),
'IsDef' : list(chain.from_iterable(isdef)),
'Id' : df['Id'].repeat(d.str.len())
})
Затем использовать cumcount
для счетчика по группам и отфильтровать все строки без первых 2 по boolean indexing
:
N = 2
df['g'] = df.groupby(['Id','IsDef']).cumcount()
df = df[df['g'] < N]
Затем изменить форму на set_index
и unstack
и добавить отсутствующие категории на reindex
,Последняя сглажена MultiIndex
в столбцах на f-string
s:
mux = pd.MultiIndex.from_product([['Y','N'], np.arange(N)])
df = df.set_index(['Id','IsDef', 'g'])['Data'].unstack([1,2]).reindex(columns=mux)
df.columns = [f'Data{i}_{j+1}' for i, j in df.columns]
print (df)
DataY_1 DataY_2 DataN_1 DataN_2
Id
1 1a NaN NaN NaN
2 2d NaN 2a 2b
3 3b NaN 3a NaN