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)
?