如何在熊猫数据框中仅针对 dtype bool 列将 True 和 False 映射为“是”和“否”?

Posted

技术标签:

【中文标题】如何在熊猫数据框中仅针对 dtype bool 列将 True 和 False 映射为“是”和“否”?【英文标题】:How to map True and False to 'Yes' and 'No' in a pandas data frame for columns of dtype bool only? 【发布时间】:2017-12-25 02:00:00 【问题描述】:

我有一个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

我想将数据框中所有属于dtypebool 的列映射到True/FalseYes/No

我如何告诉 pandas 只为 dtype bool 的列运行映射 True/False 到任意字符串,而无需明确指定列的名称,因为我可能事先不知道它们?

【问题讨论】:

你想在所有 dtype bool 的列上还是只在列 eq 上使用这个? @jacoblaw,我想将 True/False 映射到 Yes/No 数据框中的所有列 dtype bool 【参考方案1】:

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

我认为最快的方法是在循环中使用地图:

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

【讨论】:

似乎比我的方法更好 (+1),我不确定,但 .replace 应该比 .applymap 快​​ 高尔夫版df.replace(c: True: 'Yes', False: 'No' for c in df.select_dtypes([bool])) 感谢您的选择,太棒了。刚刚发现这也可以工作 - df.loc[:, df.dtypes == 'bool'] = df.loc[:, df.dtypes == 'bool'].replace( True: 'Yes', False: 'No' )。你对这个有什么看法? @AlexTereshenkov 是的,这也可以很好地工作。我唯一要改变的是将df.dtypes == 'bool'保存到一个变量中,以免再次重复同样的事情。 @piRSquared 这实际上非常好(我总是忘记替换可以将列名作为键)。我认为select_dtypes 创建了不必要的副本。如果我能够对视图进行操作,那将是可以的,但在当前状态下,比较 dtypes 似乎是一个更好的选择。【参考方案2】:

一个很好的解决方法是创建一个函数,首先检查元素是否为 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

【讨论】:

【参考方案3】:

我的看法

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 列将 True 和 False 映射为“是”和“否”?的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中仅提取数字和字符串

根据熊猫数据框中的列标签对数据进行分组

转换熊猫数据框中的分类数据

如何仅聚合混合 dtypes 数据框中的数字列

检查字符串是不是在熊猫数据框中

如何在 Pandas 数据框中的特定位置插入一列? (更改熊猫数据框中的列顺序)