在pandas中通过一个字典映射多个列

2024-05-15 21:10:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含多个列的DataFrame,其中有“yes”和“no”字符串。我想把它们都转换成布尔型。要映射一列,我将使用

dict_map_yn_bool={'yes':True, 'no':False}
df['nearby_subway_station'].map(dict_map_yn_bool)

这就可以完成一列的工作了。如何用一行代码替换多个列?在


Tags: no字符串代码falsetruemapdataframedf
3条回答

您可以使用^{}

df = pd.DataFrame({'nearby_subway_station':['yes','no'], 'Station':['no','yes']})
print (df)
  Station nearby_subway_station
0      no                   yes
1     yes                    no

dict_map_yn_bool={'yes':True, 'no':False}

df = df.applymap(dict_map_yn_bool.get)
print (df)
  Station nearby_subway_station
0   False                  True
1    True                 False

另一种解决方案:

^{pr2}$

感谢Jon Clements提供非常好的主意-使用^{}

df = df.replace({'yes': True, 'no': False})
print (df)
  Station nearby_subway_station
0   False                  True
1    True                 False

如果dict中没有数据,则存在一些差异:

df = pd.DataFrame({'nearby_subway_station':['yes','no','a'], 'Station':['no','yes','no']})
print (df)
  Station nearby_subway_station
0      no                   yes
1     yes                    no
2      no                     a

applymapbooleanstrings创建{},用于数字NaN。在

df = df.applymap(dict_map_yn_bool.get)
print (df)
  Station nearby_subway_station
0   False                  True
1    True                 False
2   False                  None

map创建NaN

for x in df:
    df[x] = df[x].map(dict_map_yn_bool)

print (df)
  Station nearby_subway_station
0   False                  True
1    True                 False
2   False                   NaN

replace不要创建NaNNone,但原始数据不变:

df = df.replace(dict_map_yn_bool)
print (df)
  Station nearby_subway_station
0   False                  True
1    True                 False
2   False                     a

我会和pandas.DataFrame.replace因为我认为这是最简单的,并且有支持这个任务的内置参数。也可以按要求提供一个线性解决方案。在

第一种情况下,替换“yes”或“no”的所有实例:

import pandas as pd
import numpy as np
from numpy import random

# Generating the data, 20 rows by 5 columns.
data = random.choice(['yes','no'], size=(20, 5), replace=True)
col_names = ['col_{}'.format(a) for a in range(1,6)]
df = pd.DataFrame(data, columns=col_names)

# Supplying lists of values to what they will replace. No dict needed.
df_bool = df.replace(to_replace=['yes','no'], value=[True, False])

第二种情况,您只想替换列的子集,如的文档中所述DataFrame.replace. 使用嵌套字典,其中第一组键是包含要替换的值的列,而值是将值映射到替换项的字典:

^{pr2}$

您可以使用stack/unstack习惯用法

df.stack().map(dict_map_yn_bool).unstack()

使用@jezrael的设置

^{pr2}$

那么

df.stack().map(dict_map_yn_bool).unstack()

  Station nearby_subway_station
0   False                  True
1    True                 False

计时
小数据

enter image description here

更大的数据

enter image description here

相关问题 更多 >