df = df.assign(label=[''.join([df.columns[n] for n, bool in enumerate(row) if bool])
for _, row in df.iterrows()])
>>> df
A B C label
0 1 0 0 A
1 1 1 0 AB
2 0 1 0 B
3 0 0 1 C
Thời gian
# Set-up:
df_ = pd.concat([df] * 10000)
%%timeit
# Solution by @Wen
df1 = df_.reset_index().melt('index')
df1 = df1[df1.value==1]
df['label'] = df1.groupby('index').variable.sum()
# 10 loops, best of 3: 47.6 ms per loop
%%timeit
# Solution by @MaxU
df_['label'] = df_.apply(lambda x: ''.join(df_.columns[x.astype(bool)].tolist()), axis=1)
# 1 loop, best of 3: 4.99 s per loop
%%timeit
# Solution by @TedPetrou
df_['label'] = np.where(df_, df_.columns, '').sum(axis=1)
# 100 loops, best of 3: 12.5 ms per loop
%%timeit
# Solution by @Alexander
df_['label'] = [''.join([df_.columns[n] for n, bool in enumerate(row) if bool]) for _, row in df_.iterrows()]
# 1 loop, best of 3: 3.75 s per loop
%%time
# Solution by @PiRSquared
df_['label'] = df_.dot(df_.columns)
# CPU times: user 18.1 ms, sys: 706 µs, total: 18.8 ms
# Wall time: 18.9 ms
"Trong [101]:" Tôi tự hỏi có gì khác trên sổ ghi chép đó – GiantsLoveDeathMetal
@GiantsLoveDeathMetal, cộng đồng Pandas của chúng tôi đang phát triển - thực sự đánh giá cao điều này! :-) – MaxU
@GiantsLoveDeathMetal Đây là lời nhắc thiết bị đầu cuối IPython, không phải sổ ghi chép. Nếu con số là 101, điều đó có nghĩa là có 100 lần không thành công để nhận được câu trả lời đúng ... LOL (j/k ;-)) –