En DataFrames,

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

Lo que quiero es la lista de item_# que tiene el estado "A" y el estado "B". algo como df.groupby('item_#')[(df.status.isin(['A', 'B']), pero en realidad esto no funciona. Me da todo el elemento que cualquiera de los valores en la lista.

Cualquier sugerencia sería apreciada!

1
user3739312 22 ene. 2018 a las 23:58

3 respuestas

La mejor respuesta

Puedes usar 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

Método de actualización

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
2
YOBEN_S 28 abr. 2019 a las 20:33

Puedes usar set:

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

Salida:

Item_ # status field1 field2

0     123      A   val1   val2
2     123      B   val5   val6
0
Scott Boston 24 ene. 2018 a las 06:29

También puedes usar unstack, dropna y stack:

df.groupby(['item_#','status']).first().unstack().dropna().stack()
Out[136]: 
                    field1   field2
item_# status                      
123        "A"      "val1"   "val2"
           "B"      "val5"   "val6"
0
Allen 22 ene. 2018 a las 22:33
48390150