过滤pandas中的分组df

Abh*_*bhi 39 python pandas

我正在groupby从Pandas 创建一个对象,DataFrame并希望选择> 1大小的所有组.

以下似乎不起作用:

grouped[grouped.size > 1 ]
Run Code Online (Sandbox Code Playgroud)

另外,如何从分组中筛选出某些值DataFrame?例如,如何删除grouped'name'具有值的所有行'foo''bar'

受控示例:

df = pandas.DataFrame({'A': ['foo','bar','foo','foo'],
                       'B': range(4)})
grouped = df.groupby('A')
Run Code Online (Sandbox Code Playgroud)

groupby删除组大小<= 1的组后,我需要该对象.

我尝试了以下,但没有用:

grouped[grouped.size() > 1]
Run Code Online (Sandbox Code Playgroud)

我期望:

A
foo 0
    2
    3
Run Code Online (Sandbox Code Playgroud)

我不确定索引/切片如何对该grouped对象起作用.

ely*_*ase 42

从pandas 0.12开始,您可以:

>>> grouped.filter(lambda x: len(x) > 1)

     A  B
0  foo  0
2  foo  2
3  foo  3
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法在过滤后获取GroupBy对象,而不是DataFrame?我现在看到的唯一方法是再次调用groupby,但这似乎效率低下 (37认同)
  • `x`将是groupby操作的每个子组,您可以使用`grouped.groups`进行检查.在多列组的情况下,这些子组引用了几个列,但这是无关紧要的,因为`len`由pandas对象中的行计数. (3认同)

Sea*_*der 11

我发现transform它比filter非常大的数据帧效率高得多:

element_group_sizes = df['A'].groupby(df['A']).transform('size')
df[element_group_sizes>1]
Run Code Online (Sandbox Code Playgroud)

或者,在一行中:

df[df['A'].groupby(df['A']).transform('size')>1]
Run Code Online (Sandbox Code Playgroud)


Cha*_*She 7

如果您仍需要解决方法:

In [49]: pd.concat([group for _, group in grouped if len(group) > 1])
Out[49]: 
     A  B
0  foo  0
2  foo  2
3  foo  3
Run Code Online (Sandbox Code Playgroud)