Pandas 按值计数分组过滤

4
我想过滤掉频率小于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个回答

4
你可以直接存储.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

1
这可以用一行代码的 .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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接