Python 如何将真与假映射到';是';和';否';在数据框中,是否仅针对数据类型为bool的列?

Python 如何将真与假映射到';是';和';否';在数据框中,是否仅针对数据类型为bool的列?,python,pandas,dataframe,replace,boolean,Python,Pandas,Dataframe,Replace,Boolean,我有一个pandas数据框(V0.20.3): 如果我想将True/False替换为'Yes'/'No',我可以运行以下命令: df.replace({ True: 'Yes', False: 'No' }) coname1 coname2 eq 0 Apple Apple Yes 1 Yahoo Google No 这似乎完成了任务。但是,如果数据帧只是列中值为0/1的

我有一个
pandas
数据框(V0.20.3):

如果我想将
True/False
替换为
'Yes'/'No'
,我可以运行以下命令:

df.replace({
                True: 'Yes',
                False: 'No'
            })

   coname1 coname2   eq
0    Apple   Apple  Yes
1    Yahoo  Google   No
这似乎完成了任务。但是,如果数据帧只是列中值为
0/1
的一行,它也将被替换,因为它被视为布尔值

df1 = pd.DataFrame({'coname1': [1], 'coname2':['Google'], 'coname3':[777]})
df1['eq'] = True

   coname1 coname2  coname3    eq
0        1  Google      777  True

df1.replace({
                True: 'Yes',
                False: 'No'
            })

  coname1 coname2 coname3   eq
0     Yes  Google     777  Yes
我想将数据框中数据类型为
dtype
bool
的所有列的
True/False
映射为
Yes/No


我如何告诉
pandas
仅为
dtype
bool的列运行将真/假映射到任意字符串,而不明确指定列的名称,因为我可能事先不知道这些列的名称?

使用dtypes属性检查列是否为布尔值,并基于此进行筛选:

df = pd.DataFrame({'A': [0, 1], 'B': ['x', 'y'], 
                   'C': [True, False], 'D': [False, True]})

df
Out: 
   A  B      C      D
0  0  x   True  False
1  1  y  False   True

bool_cols = df.columns[df.dtypes == 'bool']

df[bool_cols] = df[bool_cols].replace({True: 'Yes', False: 'No'})

df
Out: 
   A  B    C    D
0  0  x  Yes   No
1  1  y   No  Yes
我认为最快的方法是在循环中使用map:

for col in df.columns[df.dtypes == 'bool']:
    df[col] = df[col].map({True: 'Yes', False: 'No'})

一个很好的解决方法是创建一个函数,首先检查元素是否为bool类型,然后使用
applymap

import pandas as pd

df1 = pd.DataFrame({'coname1': [1], 'coname2':['Google'], 'coname3':[777]})
df1['eq'] = True

def bool2yes(boolean):
    if isinstance(boolean, bool):
        if boolean == True:
            return "Yes"
        else:
            return "No"
    else:
        return boolean

>>> df1.applymap(bool2yes)
   coname1 coname2  coname3   eq
0        1  Google      777  Yes
我的看法

cols = df.columns[df.dtypes.eq(bool)]
vals = np.column_stack([df[c].values for c in cols])

df[cols] = np.array(['No', 'Yes'])[vals.astype(int)]

df

   A  B    C    D
0  0  x  Yes   No
1  1  y   No  Yes

您想在所有数据框中属于dtype bool的列上使用此选项,还是只在列eq上使用此选项?@jacoblaw,我想将数据框中属于
dtype
bool
的所有列的
True/False
映射到
Yes/No
。这似乎是比我的(+1)更好的方法,我不确定,但是
.replace
应该比
快。applymap
高尔夫版本
df.replace({c:{True:'Yes',False:'No'}对于df中的c.select_dtypes([bool]))
谢谢你的选择,太棒了。我刚刚发现这也可以工作-
df.loc[:,df.dtypes=='bool']=df.loc[:,df.dtypes=='bool'].replace({True:'Yes',False:'No'})
。你觉得这个怎么样?@AlexTereshenkov是的,那也很好用。在这方面我唯一要做的改变是将
df.dtypes=='bool'
保存到一个变量中,这样就不会重复同样的事情了。@piRSquared这实际上很好(我总是忘记replace可以将列名作为键)。我认为
select\u dtypes
会创建不必要的副本。如果我能够在视图上操作,那就可以了,但在当前状态下,比较数据类型似乎是一个更好的选择。
cols = df.columns[df.dtypes.eq(bool)]
vals = np.column_stack([df[c].values for c in cols])

df[cols] = np.array(['No', 'Yes'])[vals.astype(int)]

df

   A  B    C    D
0  0  x  Yes   No
1  1  y   No  Yes