map multiple columns by a single dictionary in pandas

前端 未结 3 658
轻奢々
轻奢々 2021-01-03 04:06

I have a DataFrame with a multiple columns with \'yes\' and \'no\' strings. I want all of them to convert to a boolian dtype. To map one column, I would use

         


        
3条回答
  •  天命终不由人
    2021-01-03 04:48

    You can use 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
    

    Another solution:

    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
    

    Thanks Jon Clements for very nice idea - using replace:

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

    Some differences if data are no in 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
    

    applymap create None for boolean, strings, for numeric 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 create 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 dont create NaN or None, but original data are untouched:

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

提交回复
热议问题