答案 0 :(得分:3)
如果仅需要1
值的匹配列:
df = (df.set_index('name')
.eq(1)
.dot(df.columns[1:].astype(str) + ',')
.str.rstrip(',')
.str.split(',', expand=True)
.add_prefix('c')
.reset_index())
print (df)
说明:
想法是使用True
创建布尔掩码,以将其替换为列名称-因此将DataFrame.eq
与1
进行比较,并将所有列的DataFrame.dot
与矩阵相乘无需先添加分隔符。然后,用Series.str.rstrip
删除最后一个对位分隔符,并将Series.str.split
用于新列,将列名更改为DataFrame.add_prefix
。
另一种解决方案:
df1 = df.set_index('name').eq(1).apply(lambda x: x.index[x].tolist(), 1)
df = pd.DataFrame(df1.values.tolist(), index=df1.index).add_prefix('c').reset_index()