如果来自多列字符串的条件为熊猫

时间:2019-07-08 17:34:18

标签: python python-3.x pandas

我正在尝试根据国家/地区和产品字符串更改某些商品的价格。

我有下表。

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

但是我不确定如何比较价格并更改那些特定产品。我尝试了多种方法,但似乎都无法正常工作。

(对我来说,将产品名称更改并分解到不同的列中不是一种选择)

1 个答案:

答案 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