Changing pandas dataframe values based on dictionary

强颜欢笑 提交于 2021-01-28 19:58:06

问题


Is there any way to replace value using dictionary or mapping? I have dataframe like this:

Q14r63: Audi                 Q14r2: BMW                 Q14r1: VW 

Selected                     Not Selected               Not Selected
Not Selected                 Selected                   Selected 
Selected                     Selected                   Not Selected 

and i have another dataframe which provides codes for the Brands. This df ofcourse can be changed into dictionary also.

Brand           Code
Audi             63
BMW              2
VW               1

Is there any way to get output where "selected" values in main df can be be changes with car brand?

Desired Output

Q14r63: Audi               Q14r2: BMW                 Q14r1: VW 

Audi                         NaN                       NaN 
NaN                          BMW                       VW 
Audi                         BMW                       NaN

回答1:


First extract by column df1['Brand'] columns with regex and then set values by mask with DataFrame.mask and missing values by DataFrame.where:

v = df.columns.str.extract('(' + '|'.join(df1['Brand']) + ')', expand=False)
print (v)
Index(['Audi', 'BMW', 'VW'], dtype='object')

m = df.eq('Selected')
print (m)
   Q14r63: Audi  Q14r2: BMW  Q14r1: VW
0          True       False      False
1         False        True       True
2          True        True      False

df = df.mask(m, v[None, :]).where(m)
print (df)
  Q14r63: Audi Q14r2: BMW Q14r1: VW
0         Audi        NaN       NaN
1          NaN        BMW        VW
2         Audi        BMW       NaN

Alternative solution with numpy.where and DataFrame constructor:

df = pd.DataFrame(np.where(m, v, np.nan), index=df.index, columns=df.columns)
print (df)
  Q14r63: Audi Q14r2: BMW Q14r1: VW
0         Audi        NaN       NaN
1          NaN        BMW        VW
2         Audi        BMW       NaN



回答2:


Here's one approach using np.where:

import numpy as np
df[:] = np.where(df.eq('Selected'), df.columns.str.split(': ').str[1], np.nan)

print(df)

 Q14r63: Audi Q14r2: BMW Q14r1: VW
0        Audi       NaN      NaN
1         NaN       BMW       VW
2        Audi       BMW      NaN



回答3:


df1 =

Q14r63: Audi                 Q14r2: BMW                 Q14r1: VW 

Selected                     Not Selected               Not Selected
Not Selected                 Selected                   Selected 
Selected                     Selected                   Not Selected 

df2 =

Brand           Code
Audi             63
BMW              2
VW               1

You can do something like this,

for column in df1.columns: 
    brand = [x for x in df2['Brand'].values if x in column][0]
    df1[column] = df1[column].replace({'Selected': brand, 'Not Selected': 'NaN'})



回答4:


Try

brand_map = dict(zip(df2.Code, df2.Brand))
{63: 'Audi', 2: 'BMW', 1: 'VW'}

mapped_values = df.columns.str.extract('Q14r(\d+)')[0].astype(int).map(brand_map)
df[:] = np.where(df == 'Selected', mapped_values, np.nan)

  Q14r63: Audi Q14r2: BMW Q14r1: VW
0         Audi        NaN       NaN
1          NaN        BMW        VW
2         Audi        BMW       NaN


来源:https://stackoverflow.com/questions/60670853/changing-pandas-dataframe-values-based-on-dictionary

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!