是否可以使用字典或映射来替换值? 我有这样的数据框:
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
答案 0 :(得分:2)
这是使用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
答案 1 :(得分:2)
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
您可以这样做,
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'})
答案 2 :(得分:1)
首先按df1['Brand']
列按regex
列提取,然后按DataFrame.mask
按掩码设置值,按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
使用numpy.where
和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
答案 3 :(得分:1)
尝试
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