通过pandas中的单个字典映射多个列

use*_*481 4 python mapping pandas

我有一个DataFrame,其中包含带有'yes'和'no'字符串的多列.我希望他们所有人都转换为boolian dtype.要映射一列,我会使用

dict_map_yn_bool={'yes':True, 'no':False}
df['nearby_subway_station'].map(dict_map_yn_bool)
Run Code Online (Sandbox Code Playgroud)

这将完成一列的工作.如何用单行代码替换多列?

piR*_*red 10

你可以使用stack/unstack成语

df.stack().map(dict_map_yn_bool).unstack()
Run Code Online (Sandbox Code Playgroud)

使用@jezrael 的设置

df = pd.DataFrame({'nearby_subway_station':['yes','no'], 'Station':['no','yes']})
dict_map_yn_bool={'yes':True, 'no':False}
Run Code Online (Sandbox Code Playgroud)

然后

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

  Station nearby_subway_station
0   False                  True
1    True                 False
Run Code Online (Sandbox Code Playgroud)

定时
小数据

在此处输入图片说明

更大的数据

在此处输入图片说明

  • 是的,我认为投反对票不是个好主意。这也是不错的解决方案。 (2认同)

jez*_*ael 7

你可以使用applymap:

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
Run Code Online (Sandbox Code Playgroud)

另一种方案:

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
Run Code Online (Sandbox Code Playgroud)

感谢Jon Clements非常好的想法 - 使用replace:

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

如果数据不存在,则存在一些差异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
Run Code Online (Sandbox Code Playgroud)

applymap创造None了boolean,strings为数字NaN.

df = df.applymap(dict_map_yn_bool.get)
print (df)
  Station nearby_subway_station
0   False                  True
1    True                 False
2   False                  None
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

replace不要创建NaN或None,但原始数据不受影响:

df = df.replace(dict_map_yn_bool)
print (df)
  Station nearby_subway_station
0   False                  True
1    True                 False
2   False                     a
Run Code Online (Sandbox Code Playgroud)

  • 为什么不只是`df.replace({'yes':True,'no':False})`? (2认同)