如何在熊猫数据框中仅针对 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
我想将数据框中所有属于dtype
bool
的列映射到True/False
到Yes/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 映射为“是”和“否”?的主要内容,如果未能解决你的问题,请参考以下文章