我正在尝试根据国家/地区和产品字符串更改某些商品的价格。
我有下表。
country product price
Us blue good apple 9
US red bad Apple 10
Us blue bad apple 12
Canada blue excel apple 8
Canada yellow good Mango 15
Mexico orange bad Orange 16
Costa yellow med Orange 15
Brazil red good Orange 19
Brazil blue bad apple 9
Guatemala purple meh Pear 32
Guatemala green sweet Melon 4
Honduras grade 2 orange 5
在此表中,如果包含字符串“蓝色” 和“苹果” 但不是来自“加拿大” 的水果的价格为小于11 ,那么我想将这些的价格设置为11 。因此,这些条件的结果将是。 (两行的价格已更改)
country product price
Us blue good apple 11
US red bad Apple 10
Us blue bad apple 12
Canada blue excel apple 8
Canada yellow good Mango 15
Mexico orange bad Orange 16
Costa yellow med Orange 15
Brazil red good Orange 19
Brazil blue bad apple 11
Guatemala purple meh Pear 32
Guatemala green sweet Melon 4
Honduras grade 2 orange 5
我尝试过
df.loc[((df['product'].str.lower().str.contains('apple')) &
(~df['country'].str.lower().str.contains('canada')) &
(~df['product'].str.lower().str.contains('red'))), 'Price'] = 11
但是我不确定如何比较价格并更改那些特定产品。我尝试了多种方法,但似乎都无法正常工作。
(对我来说,将产品名称更改并分解到不同的列中不是一种选择)
答案 0 :(得分:4)
弄清楚你的状况,这样很清楚你在做什么
c1 = df['country'].str.lower().ne('canada')
c2 = df['product'].str.contains('(?i)(?=.*blue)(?=.*apple)')
c3 = df['price'] < 11
df.assign(price=np.where(c1 & c2 & c3, 11, df['price']))
country product price
0 Us blue good apple 11
1 US red bad Apple 10
2 Us blue bad apple 12
3 Canada blue excel apple 8
4 Canada yellow good Mango 15
5 Mexico orange bad Orange 16
6 Costa yellow med Orange 15
7 Brazil red good Orange 19
8 Brazil blue bad apple 11
9 Guatemala purple meh Pear 32
10 Guatemala green sweet Melon 4
11 Honduras grade 2 orange 5
如果要就地修改,请使用loc
df.loc[c1 & c2 & c3, 'price'] = 11