Применение расчетов к кадру данных, где выполняются условия - PullRequest
1 голос
/ 27 марта 2020

У меня есть pandas фрейм данных, который выглядит следующим образом:

df

     date           name        product                 items
0    2020-01-01     google          one                 224.0
2    2020-01-01     amazon          two                   4.0
3    2020-01-01     amazon        three                   8.0
1    2020-01-01     amazon         four                   4.0
0    2020-01-01     amazon          one                  17.0
..          ...     ...             ...                   ...
351  2020-03-27     google         five                   9.0
352  2020-03-27     google          six                   8.0
353  2020-03-27     google          one                 117.0
426  2020-03-27     amazon        three                  18.0
427  2020-03-27     amazon         four                   1.0

Я пытаюсь применить простое умножение для нового столбца price который имеет два условия, например:

  • Если имя Google и product - один, то items * 100
  • Если имя Google и product - два, затем items * 150
  • Если имя Амазонка и продукт один, то items * 50

И т. д.

Как я могу применить умножения с двумя условиями? Я предполагаю, что простая фильтрация df при применении вычислений будет делать эту работу, верно?

Что я пробовал:

df['price'[df['name']=='google' & df['product']] == 'one']= df['items'].apply(lambda x:x*100)

Но я получаю ошибку:

TypeError: Невозможно выполнить 'rand_' с массивом dtyped [object] и скаляром типа [bool]

Как я могу добиться применения вычислений при соблюдении двух условий?

1 Ответ

2 голосов
/ 27 марта 2020

Для одного условия возможно изменить свое решение, выбрав маску с обеих сторон и несколько:

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