Pandas посчитать количество элементов равное заданному значению
Дан df:
a = pd.DataFrame([{'id': 1, 'b': 1, 'd': 'AAAA - dkfkdnfk'},
{'id': 1, 'b': 2, 'd': 'AAAA - dkijonfk'},
{'id': 1, 'b': 2, 'd': 'AAAnA - dijodnfk'},
{'id': 1, 'b': 2, 'd': 'AAAA - kjldkfkdnfk'},
{'id': 1, 'b': 4, 'd': 'AAAA - dkfkdnfk'},
{'id': 2, 'b': 1, 'd': 'BBB - dkfkdnfk'},
{'id': 2, 'b': 2, 'd': 'BBB - dkfikoikdnfk'},
{'id': 2, 'b': 2, 'd': 'BBBk - dkkfkdnfk'},
{'id': 2, 'b': 2, 'd': 'BBB - dkfkdnfk'},
{'id': 2, 'b': 2, 'd': 'BBB - dkfkdnfk'}])
Нужно сгруппировав по id, далее у b == 2 посчитать сколько у них значений d (d.split(' - ')[0]) совпадает со значением d (d.split(' - ')[0]) из b == 1 того же id. Результат записать в столбец k. Должно получиться:
pd.DataFrame([{'id': 1, 'b': 1, 'd': 'AAAA - dkfkdnfk', 'k': '2'},
{'id': 1, 'b': 2, 'd': 'AAAA - dkijonfk', 'k': '2'},
{'id': 1, 'b': 2, 'd': 'AAAnA - dijodnfk', 'k': '2'},
{'id': 1, 'b': 2, 'd': 'AAAA - kjldkfkdnfk', 'k': '2'},
{'id': 1, 'b': 4, 'd': 'AAAA - dkfkdnfk', 'k': '2'},
{'id': 2, 'b': 1, 'd': 'BBB - dkfkdnfk', 'k': '3'},
{'id': 2, 'b': 2, 'd': 'BBB - dkfikoikdnfk', 'k': '3'},
{'id': 2, 'b': 2, 'd': 'BBBk - dkkfkdnfk', 'k': '3'},
{'id': 2, 'b': 2, 'd': 'BBB - dkfkdnfk', 'k': '3'},
{'id': 2, 'b': 2, 'd': 'BBB - dkfkdnfk', 'k': '3'}])
P.S. У каждого id будет только одна строка с b == 1.
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Можно попробовать так:
a[["tmp"]] = a["d"].str.split("-").str[0]
a["k"] = a.groupby("id").apply(lambda x: (x["b"]==2)&(x["tmp"] == x["tmp"].iloc[0])).groupby("id").transform(sum).to_list()
a.drop("tmp", axis=1, inplace=True)
a:
id b d k
0 1 1 AAAA - dkfkdnfk 2
1 1 2 AAAA - dkijonfk 2
2 1 2 AAAnA - dijodnfk 2
3 1 2 AAAA - kjldkfkdnfk 2
4 1 4 AAAA - dkfkdnfk 2
5 2 1 BBB - dkfkdnfk 3
6 2 2 BBB - dkfikoikdnfk 3
7 2 2 BBBk - dkkfkdnfk 3
8 2 2 BBB - dkfkdnfk 3
9 2 2 BBB - dkfkdnfk 3
Но вообще, хотелось бы видеть уже ваши попытки что-то сделать. Иначе создается впечатление, что мы делаем за вас вашу работу.