Я хотел бы отфильтровать частоты меньше n, в моем случае n равно 2
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'bar',],'B' : ['yes', 'no', 'yes', 'no', 'no', 'yes','yes', 'no', 'no', 'no']})
df.groupby('A')['B'].value_counts()
A B
bar no 4
yes 1
foo yes 3
no 2
Name: B, dtype: int64
В идеале я хотел бы, чтобы результаты были в фрейме данных, показанном ниже (частота 1 не исключена)
A B freq
bar no 4
foo yes 3
foo no 2
я пытался
df.groupby('A')['B'].filter(lambda x: len(x) > 1)
но это не удается, поскольку, по-видимому, groupby возвращает серию
Вы можете просто сохранить вывод метода .value_counts()
, а затем просто отфильтровать его:
>>> counts = df.groupby('A')['B'].value_counts()
>>> counts[counts >= 2]
A B
bar no 4
foo yes 3
no 2
Name: B, dtype: int64
Если вы хотите получить желаемый результат, вы можете вызвать метод .reset_index()
и переименовать новый столбец:
>>> counts[counts >= 2].reset_index(name='count')
A B count
0 bar no 4
1 foo yes 3
2 foo no 2
Это может быть с одной линией с .loc
>>> df.groupby('A')['B'].value_counts().loc[lambda x: x > 1].reset_index(name='count')
A B count
0 bar no 4
1 foo yes 3
2 foo no 2