pandas Фрейм данных фильтрует столбец по ключевому слову на основе агрегации другого столбца. - PullRequest
0 голосов
/ 05 апреля 2020

Представьте, что у меня есть следующий фрейм данных df:

Contract_Id, date, product, qty
1,2016-08-06,a,1
1,2016-08-06,b,2
1,2017-08-06,c,2
2,2016-08-06,a,1
3,2016-08-06,a,2
3,2017-08-06,a,2
4,2016-08-06,b,2
4,2017-09-06,a,2

Я пытаюсь выяснить, имеет ли каждый идентификатор контракта продукт b или продукт a, и возвращает 2 столбца.

Идеальный результат:

Contract_Id, date, product, qty, contract_id_has_a, contract_id_has_b
1,2016-08-06,a,1,True,True
1,2016-08-06,b,2,True,True
2,2016-08-06,a,1,True,False
3,2016-08-06,a,2,True,False
4,2016-08-06,b,2,False,True

Это вернет только, если в этой строке есть продукт a или нет

df[‘product’].str.contains('a', flags=re.IGNORECASE, regex=True)

Я пытался:

import re 

df[‘product’].groupby([‘Contract_Id']).str.contains('a', flags=re.IGNORECASE, regex=True)

KeyError: ‘Contract_Id'

Может ли кто-нибудь просветить? Спасибо!

1 Ответ

1 голос
/ 05 апреля 2020

Чтобы выполнить группировку, но вернуть значения для всех исходных строк в конце (и не только для каждой группы), вы должны использовать функцию pd.transform . Затем вы можете проверить, совпадает ли какая-либо из групп, и установить ее для всех строк.

Это будет работать:

df['contract_id_has_a'] = df.groupby('Contract_Id')['product'].transform(lambda x: x.str.contains('a').any())
...