pandas在groupby之后选择行

时间:2018-01-22 20:58:03

标签: pandas pandas-groupby

在DataFrames中,

 item_#, status, field1, field2 
   123,    "A",    "val1", "val2"
   223,    "B",    "val3", "val4"
   123,    "B",    "val5", "val6"
   323,    "A",    "val7", "val8"

我想要的是状态为item_#和状态为"A"的{​​{1}}列表。 像"B")这样的东西,但这实际上并不起作用。它为我提供了列表中任何一个值的所有项目。

任何建议都将不胜感激!

3 个答案:

答案 0 :(得分:2)

您可以使用filter + 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

答案 1 :(得分:0)

您可以使用set

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

输出:

item_ #status field1 field2

0     123      A   val1   val2
2     123      B   val5   val6

答案 2 :(得分:0)

你也可以使用unstack,dropna和stack:

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