установка значения для столбца на основе группировки других столбцов - PullRequest
0 голосов
/ 29 июня 2018

пытается использовать панд loc для подстановки фрейма данных critera и передачи значения другому столбцу.

инициализировать фрейм данных

import random
random.seed(100)

nums = 100
df = pd.DataFrame({'value':[random.randint(-7, 10) for x in range(nums)],
                      'id': [random.randint(500, 520) for x in range(nums)], 
                     'prod': [random.choice(['carrots', 'apples', 'pears', 'corn', 'baby corn', 'peppers', 'jalapenos', 'chicken', 'beef', 'raddishes']) for x in range(nums)],
                     'region':[random.choice(['east', 'west', 'central', 'south']) for x in range(nums)],
                     'country':[random.choice(['us', 'ca', 'mx']) for x in range(nums)],
                     'tag': np.nan})

Я пытаюсь сделать что-то вроде "набора данных фильтра" по us или ca, но только в регионах east и west, где сумма значений в сгруппированных prod и id равна отрицательный.

выполняет следующие операции индексации фрейма данных по тому, что я только что сгруппировал, но я пытаюсь изолировать его по индексу.

df.groupby(['id', 'prod'])['value'].sum().loc[lambda x: x <0].head(10)

id   prod     
500  apples      -6
     carrots     -6
     corn        -6
501  apples      -3
     chicken     -2
502  beef        -3
     pears       -2
503  chicken     -3
504  jalapenos   -4
505  chicken     -4

Я пытался сделать что-то вроде:

df.loc[(df.country.isin(['us', 'ca'])) & (df.region.isin(['east', 'west'])) & (df.groupby(['id', 'prod'])['value'].sum().loc[lambda x: x <0]), 'tag'] = True

как использовать результат из сгруппированного фрейма данных в качестве фильтра в пандах loc?

1 Ответ

0 голосов
/ 29 июня 2018

Если вместо .sum() использовать .transform('sum'), вы получите сгруппированный результат, возвращаемый для каждой строки. И сравнивая это значение с < 0, вы получите логическую маску.

Затем мы можем создать ваши разные маски в отдельных строках и соединить их с помощью &.

m1 = df.country.isin({'us', 'ca'})
m2 = df.region.isin({'east', 'west'})
m3 = df.groupby(['id', 'prod'])['value'].transform('sum') < 0

df.loc[m1&m2&m3, 'tag'] = True

Вам это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...