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

时间:2017-05-01 20:09:28

标签: python pandas mapping

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

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

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

3 个答案:

答案 0 :(得分:6)

您可以使用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

另一种解决方案:

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

感谢Jon Clements非常好的主意 - 使用replace

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

applymapNone创建booleanstrings,用于数字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

答案 1 :(得分:4)

您可以使用stack / unstack成语

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

使用@ jezrael的设置

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

然后

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

答案 2 :(得分:0)

我会使用pandas.DataFrame.replace,因为我认为它是最简单的并且有内置的参数来支持这个任务。也可根据要求提供单线解决方案。

第一种情况,替换&#39;是&#39;的所有实例或者&#39; no&#39;:

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的文档中所述。使用嵌套字典,其中第一组键是具有要替换的值的列,值是将值映射到其替换的字典:

dict_map_yn_bool={'yes':True, 'no':False}
replace_dict = {'col_1':dict_map_yn_bool, 
           'col_2':dict_map_yn_bool}
df_bool = df.replace(to_replace=replace_dict)