Как отфильтровать DF передавая в него Series c метками True/False
Прошу подсказать, есть такое задание:
Создайте новый столбец - mcc_code+tr_type, сконкатенировав значения из соответствующих столбцов. (*) Для получившегося столбца определите дисперсию сумм трат тех категорий, в которых не менее 10 наблюдений.
transactions['mcc_code_and_tr_type'] = transactions['mcc_code'].astype(str) + transactions['tr_type'].astype(str)
groups = transactions.groupby(['mcc_code_and_tr_type']).size() > 10
вот что я смог сделать, получить Серию примерно с такими записями.
17111110 True
17311010 False
17311110 False
17991110 True
27411110 False
27411210 False
30001010 True
30001100 True
30001110 True
30001200 True
30001210 True
30006000 True
30006010 False
Как мне отфильтровать исходный DF, там около милиона записей, но серия всего 900 (по кол-ву индексов не совподает). Прошла мысль, что сортировать вообще не надо. Сумма трат это значения по столбцу amount со отрицательный значением. (<0)
DF как пример
amount term_id gender mcc_code_and_tr_type
345083 -1257.71 248523 1.0 59121010
694663 -67377.47 462049 NaN 60112010
527513 56147.89 85814 NaN 60117010
573203 -110049.87 NaN NaN 60112010
460705 -11229.58 10367164 1.0 59411010
402169 -10645.64 293228 0.0 54111010
137120 -3076.90 00035644 1.0 54991110
Ответы (1 шт):
Чтобы оставить в DataFrame только те группы, которые содержат минимум N строк, можно воспользоваться DataFrame.groupby(...).filter(lambda x: len(x) >= N).
Пример:
Исходный DF:
In [178]: df
Out[178]:
grp amt
0 1 11
1 1 12
2 1 13
3 2 14
4 2 15
5 3 16
6 4 17
Решение - оставлем только те строки, для которых существует минимум 2 одинаковых grp (т.е. в итоге должны остаться только записи с grp: 1 и 2):
N = 2
res = df.groupby("grp").filter(lambda x: len(x) >= N)
Результат:
In [185]: res
Out[185]:
grp amt
0 1 11
1 1 12
2 1 13
3 2 14
4 2 15
PS я думаю, посчитать дисперсию труда не составит.