How to replace a value in a pandas dataframe with column name based on a condition?

One way could be to use replace and pass in a Series mapping column labels to values (those same labels in this case):

>>> dfz.loc[:, 'A':'D'].replace(1, pd.Series(dfz.columns, dfz.columns))
   A  B  C  D
0  A  B  C  D
1  0  0  0  0
2  0  0  0  0
3  A  B  C  D
4  0  0  3  0
5  0  B  C  0

To make the change permanent, you'd assign the returned DataFrame back to dfz.loc[:, 'A':'D'].

Solutions aside, it's useful to keep in mind that you may lose a lot of performance benefits when you mix numeric and string types in columns, as pandas is forced to use the generic 'object' dtype to hold the values.


A solution using where:

>>> dfz.where(dfz != 1, dfz.columns.to_series(), axis=1)
   A  B  C  D      E
0  A  B  C  D   22.0
1  0  0  0  0   15.0
2  0  0  0  0    NaN
3  A  B  C  D   10.0
4  0  0  3  0    NaN
5  0  B  C  0  557.0