Используйте Series.replace
со словарем и $
для последних значений строк, здесь последний 1, 2
, измените форму на Series.str.rsplit
с n=1
для разделения по последнему _
, затем DataFrame.pivot
и очистка данных DataFrame.rename_axis
с помощью DataFrame.add_prefix
:
df1 = (df.join(df['id'].replace({'1$':'a', '2$':'b'}, regex=True)
.str.rsplit('_', expand=True, n=1))
.pivot(0,1,'Shimmer')
.rename_axis(index='id', columns=None)
.add_prefix('Shimmer_')
.reset_index())
Решение без rename
последние значения после _
, но со счетчиком на GroupBy.cumcount
:
df1 = (df.assign(a = df['id'].str.rsplit('_', n=1).str[0],
g = lambda x: x.groupby('a').cumcount())
.pivot('a','g','Shimmer')
.rename(columns=({0:'a', 1:'b'}))
.rename_axis(index='id', columns=None)
.add_prefix('Shimmer_')
.reset_index()
)
print (df1)
id Shimmer_a Shimmer_b
0 P01_S01 2.31 3.87
1 P01_S02 2.54 2.96
2 P02_S01 1.78 3.19
3 P02_S02 2.04 2.08