Один из вариантов - использовать replace
и add_prefix
:
df.replace({k: 1 for k in df.columns},
{k: v for k, v in zip(df.columns, df.add_prefix('pos').columns.values)})
В качестве альтернативы, вы можете использовать apply
и заменить 1
значения на pos
+ .name
свойство этогозапись (которая в данном случае эквивалентна имени столбца):
df.apply(lambda row: [f"pos{row.name}" if x == 1 else x for x in row], axis=0)
Вывод (для обоих подходов):
1 2 3 4 5
Index
0 pos1 pos2 0 0 0
Данные:
df = pd.DataFrame([{'1': 1, '2': 1, '3': 0, '4': 0, '5': 0}]).rename_axis('Index')