Pandas groupby value_count фильтр по частоте - PullRequest
0 голосов
/ 01 мая 2018

Я бы хотел отфильтровать частоты, которые меньше 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 возвращает серию

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Это может быть вниз одной строкой с .loc

df.groupby('A')['B'].value_counts().loc[lambda x : x>1].reset_index(name='count')
Out[530]: 
     A    B  count
0  bar   no      4
1  foo  yes      3
2  foo   no      2
0 голосов
/ 01 мая 2018

Вы можете просто сохранить вывод value_counts и затем отфильтровать его:

In[3]:
counts = df.groupby('A')['B'].value_counts()
counts[counts>=2]

Out[3]: 
A    B  
bar  no     4
foo  yes    3
     no     2
Name: B, dtype: int64

Если вы хотите получить желаемый результат, вы можете позвонить reset_index и переименовать новый столбец:

In[21]:
counts[counts>=2].reset_index(name='count')

Out[21]: 
     A    B  count
0  bar   no      4
1  foo  yes      3
2  foo   no      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...