Python3 Pandas - трансформируйте и возвращайте серию нового ценового столбца - PullRequest
0 голосов
/ 06 января 2019

Я работал над вопросом, который просит меня выполнить несколько операций с использованием split-apply-Объединить. Я получил ответы на большинство из них, кроме последнего вопроса.

Вот последний вопрос:

Если максимальная цена в категории превышает 3 доллара, уменьшите все цены в этой категории на 10%. Вернуть серию нового ценового столбца.

import pandas as pd 
import numpy as np
grocery = pd.DataFrame({'category':['produce', 'produce', 'meat',
                                'meat', 'meat', 'cheese', 'cheese'],
                    'item':['celery', 'apple', 'ham', 'turkey',  'lamb',
                            'cheddar', 'brie'],
                    'price':[.99, .49, 1.89, 4.34, 9.50, 6.25, 8.0]})
grouped = grocery.groupby('category')
answer = grouped.transform(lambda x: 0.9 * x if np.max(x) > 3 else x)

Мне кажется, я получил часть снижения всех цен в категории на 10%. Однако у меня возникла проблема с тем, как я могу вернуть свой «ответ» в виде серии нового столбца цен.

Когда я отправляю то, что у меня есть ('ответ'), на страницу отправки, значения цены верны, но это не считается серией. Я знаю pd.Series, но не уверен, как я могу преобразовать это в Series здесь.

Может ли кто-нибудь дать мне понимание?

1 Ответ

0 голосов
/ 06 января 2019

Просто назначьте новый столбец, потому что GroupBy.transform возвращает серию с таким же размером, как у оригинала DataFrame, также для общего решения необходимо указать столбец price после groupby для обработки только этого столбца:

grouped = grocery.groupby('category')['price']
print (type(grouped.transform(lambda x: 0.9 * x if np.max(x) > 3 else x)))
<class 'pandas.core.series.Series'>

print (grouped.transform(lambda x: 0.9 * x if np.max(x) > 3 else x))
0    0.990
1    0.490
2    1.701
3    3.906
4    8.550
5    5.625
6    7.200
Name: price, dtype: float64

При необходимости присваивать столбцу price:

grocery['price'] = grouped.transform(lambda x: 0.9 * x if np.max(x) > 3 else x)
print (grocery)
  category     item  price
0  produce   celery  0.990
1  produce    apple  0.490
2     meat      ham  1.701
3     meat   turkey  3.906
4     meat     lamb  8.550
5   cheese  cheddar  5.625
6   cheese     brie  7.200

И раствор с assign:

grocery = (grocery.assign(price = lambda x: x.groupby('category')['price']
                                             .transform(lambda x: 0.9 * x 
                                                                  if np.max(x) > 3 
                                                                  else x)))
...