Панды, если условие из нескольких строк столбцов - PullRequest
2 голосов
/ 08 июля 2019

Я пытаюсь изменить цену некоторых товаров в зависимости от страны и строки продукта.

У меня есть таблица ниже.

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 Ответ

4 голосов
/ 08 июля 2019

Разделите ваши условия, чтобы было ясно, что вы делаете


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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...