Для одного условия возможно изменить свое решение, выбрав маску с обеих сторон и несколько:
m = (df['name']=='google') & (df['product'] == 'one')
df.loc[m, 'price'] = df.loc[m, 'items'] * 100
print (df)
date name product items price
0 2020-01-01 google one 224.0 22400.0
2 2020-01-01 amazon two 4.0 NaN
3 2020-01-01 amazon three 8.0 NaN
1 2020-01-01 amazon four 4.0 NaN
0 2020-01-01 amazon one 17.0 NaN
351 2020-03-27 google five 9.0 NaN
352 2020-03-27 google six 8.0 NaN
353 2020-03-27 google one 117.0 11700.0
426 2020-03-27 amazon three 18.0 NaN
427 2020-03-27 amazon four 1.0 NaN
Если несколько условий используют numpy.select
:
m1 = (df['name']=='google') & (df['product'] == 'one')
m2 = (df['name']=='google') & (df['product'] == 'two')
df['price'] = np.select([m1, m2], [100, 150], default=np.nan) * df['items']
print (df)
date name product items price
0 2020-01-01 google one 224.0 22400.0
2 2020-01-01 amazon two 4.0 NaN
3 2020-01-01 amazon three 8.0 NaN
1 2020-01-01 amazon four 4.0 NaN
0 2020-01-01 amazon one 17.0 NaN
351 2020-03-27 google five 9.0 NaN
352 2020-03-27 google six 8.0 NaN
353 2020-03-27 google one 117.0 11700.0
426 2020-03-27 amazon three 18.0 NaN
427 2020-03-27 amazon four 1.0 NaN
Если возможно много кодировок, создайте новые DataFrame
и DataFrame.merge
с левым соединением:
df1 = pd.DataFrame({ 'name':['google','google','amazon'],
'product':['one','two','one'],
'mult':[100, 150, 50]})
df1 = df.merge(df1, on=['name','product'], how='left')
df1['price'] = df1['mult'] * df1['items']
print (df1)
date name product items mult price
0 2020-01-01 google one 224.0 100.0 22400.0
1 2020-01-01 amazon two 4.0 NaN NaN
2 2020-01-01 amazon three 8.0 NaN NaN
3 2020-01-01 amazon four 4.0 NaN NaN
4 2020-01-01 amazon one 17.0 50.0 850.0
5 2020-03-27 google five 9.0 NaN NaN
6 2020-03-27 google six 8.0 NaN NaN
7 2020-03-27 google one 117.0 100.0 11700.0
8 2020-03-27 amazon three 18.0 NaN NaN
9 2020-03-27 amazon four 1.0 NaN NaN