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!
3 respuestas
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
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
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"
Preguntas relacionadas
Nuevas preguntas
pandas
Pandas es una biblioteca de Python para la manipulación y análisis de datos, p. marcos de datos, series de tiempo multidimensionales y conjuntos de datos transversales que se encuentran comúnmente en estadísticas, resultados de ciencias experimentales, econometría o finanzas. Pandas es una de las principales bibliotecas de ciencia de datos en Python.