如何仅将dtype bool列的大熊猫数据框中的对与错映射为“是”和“否”?


问题内容

我有一个pandas数据框(v 0.20.3):

df = pd.DataFrame({'coname1': ['Apple','Yahoo'], 'coname2':['Apple', 'Google']})
df['eq'] = df.apply(lambda row: row['coname1'] == row['coname2'], axis=1).astype(bool)

   coname1 coname2     eq
0    Apple   Apple   True
1    Yahoo  Google  False

如果要替换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

我想映射True/FalseYes/No的数据框中的所有列dtype bool

我如何告诉pandas运行True / False映射到任意字符串,仅针对那些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'})