基于字典更改数据帧值

2024-10-01 19:23:10 发布

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

是否有任何方法可以使用字典或映射替换值? 我有这样的数据帧:

Q14r63: Audi                 Q14r2: BMW                 Q14r1: VW 

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

我还有另一个数据框,它为品牌提供代码。当然,这个df也可以改成字典

Brand           Code
Audi             63
BMW              2
VW               1

如果主df中的“选定”值可以随汽车品牌变化,是否有任何方法可以获得输出

所需输出

Q14r63: Audi               Q14r2: BMW                 Q14r1: VW 

Audi                         NaN                       NaN 
NaN                          BMW                       VW 
Audi                         BMW                       NaN

Tags: 数据方法代码df字典notnanvw
3条回答

试一试

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

首先使用regex按列df1['Brand']提取列,然后使用^{}按掩码设置值,使用^{}设置缺失值:

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

使用^{}DataFrame构造函数的替代解决方案:

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

这里有一种使用^{}的方法:

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

相关问题 更多 >

    热门问题