Python 如何根据条件用列名替换数据框中的值?

Python 如何根据条件用列名替换数据框中的值?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个看起来像这样的数据框: 我想用列的名称替换A:D范围内的所有1,以便最终结果类似于: 我该怎么做 您可以使用以下命令重新创建我的数据帧: dfz = pd.DataFrame({'A' : [1,0,0,1,0,0], 'B' : [1,0,0,1,0,1], 'C' : [1,0,0,1,3,1], 'D' : [1,0,0,1,0,0],

我有一个看起来像这样的数据框:

我想用列的名称替换A:D范围内的所有1,以便最终结果类似于:

我该怎么做

您可以使用以下命令重新创建我的数据帧:

dfz = pd.DataFrame({'A' : [1,0,0,1,0,0],
                    'B' : [1,0,0,1,0,1],
                    'C' : [1,0,0,1,3,1],
                    'D' : [1,0,0,1,0,0],
                    'E' : [22.0,15.0,None,10.,None,557.0]})
一种方法是使用并传入一个系列,将列标签映射到值(本例中的标签相同):

要使更改永久化,您需要将返回的数据帧分配回
dfz.loc[:,'A':'d']


撇开解决方案不谈,请记住,在列中混合使用数字和字符串类型可能会失去许多性能优势,因为熊猫被迫使用通用的“object”数据类型来保存值。

我更喜欢@ajcr提供的非常优雅的解决方案

如果您的列名无法轻松用于切片,以下是我的解决方案:

dfz.ix[:, dfz.filter(regex=r'(A|B|C|D)').columns.tolist()] = (
    dfz[dfz!=1].ix[:,dfz.filter(regex=r'(A|B|C|D)').columns.tolist()]
               .apply(lambda x: x.fillna(x.name))
)
输出:

In [207]: dfz
Out[207]:
   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

也许它不那么优雅,但…只是在列中循环并替换:

for i in dfz[['A','B','C','D']].columns:
    dfz[i].replace(1,i,inplace=True)

使用
的解决方案,其中

>>> 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
>>> 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