python - seleccionar - Corte el marco de datos de Pandas por etiquetas que no están en una lista
seleccionar columnas de un dataframe pandas (4)
Tengo un marco de datos de pandas
, df
.
Quiero seleccionar todos los índices en df
que no están en una lista, lista blacklist.
Ahora, uso la comprensión de lista para crear las etiquetas deseadas para cortar.
ix=[i for i in df.index if i not in blacklist]
df_select=df.loc[ix]
Funciona bien, pero puede ser torpe si necesito hacer esto a menudo.
¿Hay una mejor manera de hacer esto?
Gracias a ASGM; Descubrí que necesitaba convertir el conjunto en una lista para que funcione con un MultiIndex:
mi1 = pd.MultiIndex.from_tuples([("a", 1), ("a", 2), ("b", 1), ("b", 2)])
df1 = pd.DataFrame(data={"aaa":[1,2,3,4]}, index=mi1)
setValid = set(df1.index) - set([("a", 2)])
df1.loc[list(setValid)] # works
df1.loc[setValid] # fails
(lo siento no puedo comentar, rep insuficiente)
Puede usar set()
para crear la diferencia entre sus índices originales y los que desea eliminar:
df.loc[set(df.index) - set(blacklist)]
Tiene la ventaja de ser parco, además de ser más fácil de leer que una lista de comprensión.
Use isin
en el índice e invierta el índice booleano para realizar la selección de etiquetas:
In [239]:
df = pd.DataFrame({''a'':np.random.randn(5)})
df
Out[239]:
a
0 -0.548275
1 -0.411741
2 -1.187369
3 1.028967
4 -2.755030
In [240]:
t = [2,4]
df.loc[~df.index.isin(t)]
Out[240]:
a
0 -0.548275
1 -0.411741
3 1.028967
import pandas as pd
df = pd.DataFrame(data=[5,6,7,8], index=[1,2,3,4], columns=[''D'',])
blacklist = [2,3]
#your current way ...
ix=[i for i in df.index if i not in blacklist]
df_select=df.loc[ix]
# use a mask
mask = [True if x else False for x in df.index if x not in blacklist]
df.loc[mask]
http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-label realidad, loc y iloc toman una matriz booleana, en este caso la mask
. a partir de ahora puede reutilizar esta máscara y debería ser más eficiente.