如何根据列中的布尔值进行过滤并返回groupby obj

时间:2013-10-18 01:33:18

标签: python pandas

我正在尝试返回一个groupby对象,该对象仅包含我正在分组的字段包含3个或更多条目的项目。例如,如果我有以下对象并且我在'Letters'上分组:

Letters Numbers Items Bool
A       1       lamp  1
B       2       glass 1
B       2       table 1
C       5       pic   0
B       3       glass 0
C       4       bottle 1
C       2       horse 0

然后我的代码只返回带有b

的groupby对象

我尝试了以下内容:

old_df = a_df.groupby('Letters')
new_df = old_df.filter(len(old_df['Letters'])>2)

我也试过这里提到的一些lambda东西:filtering grouped df in pandas

谢谢!


因此,如果我想返回一个向量,其中每个字母的Bool中所有值的总和,每个字母的条目数超过3,我该怎么做?根据提供的数据,这将是[2,1](B为2,C为1)

1 个答案:

答案 0 :(得分:3)

我认为你误解了groupby

的输出
In [4]: df
Out[4]:
  Letters  Numbers  Items  Bool
0       A        1   lamp     1
1       B        2  glass     1
2       B        2  table     1
3       C        5    pic     0
4       B        3  glass     0

In [6]: df.groupby('Letters').filter(lambda x: len(x) > 2)
Out[6]:
  Letters  Numbers  Items  Bool
1       B        2  glass     1
2       B        2  table     1
4       B        3  glass     0

groupby操作产生的对象是一个可迭代对象,其“iterands”是组标签的tuple s和原始DataFrame的子集对应于组。例如,

In [9]: for name, subset in df.groupby('Letters'):
   ...:     print(name)
   ...:     print(subset)
   ...:     print('\n')
   ...:
A
  Letters  Numbers Items  Bool
0       A        1  lamp     1


B
  Letters  Numbers  Items  Bool
1       B        2  glass     1
2       B        2  table     1
4       B        3  glass     0


C
  Letters  Numbers Items  Bool
3       C        5   pic     0

Bool的值加Letter,其中每组中的成员数大于2:

In [39]: df.groupby('Letters').filter(lambda x: len(x) > 2).groupby('Letters').Bool.sum()
Out[39]:
Letters
B          2
C          1
Name: Bool, dtype: int64