Pandas 在groupby之后选择行

Pandas 在groupby之后选择行,pandas,pandas-groupby,Pandas,Pandas Groupby,在数据帧中 item_#, status, field1, field2 123, "A", "val1", "val2" 223, "B", "val3", "val4" 123, "B", "val5", "val6" 323, "A", "val7", "val8" 我想要的是同时具有状态“A”和状态“B”的项的列表。 类似于df.groupby('item#')[(df.status.isin(['A','B'

在数据帧中

 item_#, status, field1, field2 
   123,    "A",    "val1", "val2"
   223,    "B",    "val3", "val4"
   123,    "B",    "val5", "val6"
   323,    "A",    "val7", "val8"
我想要的是同时具有状态
“A”
和状态
“B”
项的列表。
类似于
df.groupby('item#')[(df.status.isin(['A','B']]
),但这实际上不起作用。它会获取列表中任何一个值所包含的所有项


任何建议都将不胜感激!

您可以使用
过滤器
+
isin

df.groupby('item_#').filter(lambda x : pd.Series(['A','B']).isin(x['status']).all())
Out[473]: 
   item_# status field1 field2
0     123      A   val1   val2
2     123      B   val5   val6
更新方法

df[df.groupby('item_#').status.transform(lambda x : {'A','B'}.issubset(set(x)))]
   item_# status field1 field2
0       1      A   val1   val2
2       1      B   val5   val6

您可以使用
设置

df[df.groupby('item_#')['status']
     .transform(lambda x: set(x.values.tolist()) == {'A','B'})]
输出:

项目#状态字段1字段2

0     123      A   val1   val2
2     123      B   val5   val6

您还可以使用取消堆叠、dropna和堆栈:

df.groupby(['item_#','status']).first().unstack().dropna().stack()
Out[136]: 
                    field1   field2
item_# status                      
123        "A"      "val1"   "val2"
           "B"      "val5"   "val6"

对于本例,您希望的输出是什么?一个新的数据框只包含状态为“a”和“B”的项,因此在本例中,将是一个只包含项35;['123']因为它有两种状态。当你用已知元素声明一个集合时,你不应该使用
set
关键字。只需要使用大括号。另外,你可以像这样使用
filter
而不是
transform
df.groupby('item##').filter(lambda x:set(x['status'])>={'a','B'})
@TedPetrou感谢您的改进。我认为,一般来说,过滤器比转换布尔索引慢。简化解决方案-
集(x.values.tolist())
集(x)