python - numero - ¿Cómo se puede eliminar una lista de filas del marco de datos de Pandas?
eliminar filas pandas python (7)
En un comentario a la respuesta de @ theodros-zelleke, @ j-jones preguntó qué hacer si el índice no es único. Tuve que lidiar con una situación así. Lo que hice fue cambiar el nombre de los duplicados en el índice antes de llamar a drop()
, a la:
dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)
donde rename_duplicates()
es una función que rename_duplicates()
que pasó por los elementos del índice y renombró los duplicados. Utilicé el mismo patrón de cambio de nombre que pd.read_csv()
usa en las columnas, es decir, "%s.%d" % (name, count)
, donde name
es el nombre de la fila y el count
es cuántas veces ha ocurrido anteriormente .
Tengo un dataframe df:
>>> df
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20060630 6.590 NaN 6.590 5.291
20060930 10.103 NaN 10.103 7.981
20061231 15.915 NaN 15.915 12.686
20070331 3.196 NaN 3.196 2.710
20070630 7.907 NaN 7.907 6.459
Luego quiero soltar filas con ciertos números de secuencia que se indican en una lista, supongamos que aquí está [1,2,4],
luego a la izquierda:
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20061231 15.915 NaN 15.915 12.686
20070630 7.907 NaN 7.907 6.459
¿Cómo o qué función puede hacer eso?
Resolví esto de una manera más simple, solo en 2 pasos.
Paso 1: primero forma un marco de datos con filas / datos no deseados.
Paso 2: utilice el índice de este marco de datos no deseado para eliminar las filas del marco de datos original.
Ejemplo:
Supongamos que tiene un marco de datos de tantas columnas como ''Edad'' que es un número entero. Ahora digamos que quiere soltar todas las filas con ''Edad'' como número negativo.
Paso 1: df_age_negative = df [df [''Age''] <0]
Paso 2: df = df.drop (df_age_negative.index, axis = 0)
Espero que esto sea mucho más simple y te ayude.
Si el DataFrame es enorme, y el número de filas que se deben eliminar también es grande, el simple drop by index df.drop(df.index[])
lleva demasiado tiempo.
En mi caso, tengo un DataFrame multi-indexado de flotantes con 100M rows x 3 cols
, y necesito eliminar 10k
filas de él. El método más rápido que encontré es, en contra de la intuición, take
las filas restantes.
Deje que indexes_to_drop
sea una matriz de índices posicionales para soltar ( [1, 2, 4]
en la pregunta).
indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))
En mi caso esto tomó 20.5s
, mientras que el simple df.drop
tomó 5min 27s
df.drop
y consumió mucha memoria. El DataFrame resultante es el mismo.
Si quiero soltar una fila que digamos index x
, haría lo siguiente:
df = df[df.index != x]
Si quisiera eliminar varios índices (digamos que estos índices están en la lista de los valores unwanted_indices
), lo haría:
desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]
También puede pasar a DataFrame.drop la etiqueta en sí (en lugar de Series de etiquetas de índice):
In[17]: df
Out[17]:
a b c d e
one 0.456558 -2.536432 0.216279 -1.305855 -0.121635
two -1.015127 -0.445133 1.867681 2.179392 0.518801
In[18]: df.drop(''one'')
Out[18]:
a b c d e
two -1.015127 -0.445133 1.867681 2.179392 0.518801
Lo cual es equivalente a:
In[19]: df.drop(df.index[[0]])
Out[19]:
a b c d e
two -1.015127 -0.445133 1.867681 2.179392 0.518801
Tenga en cuenta que puede ser importante usar el comando "inplace" cuando quiera hacer la parada en línea.
df.drop(df.index[[1,3]], inplace=True)
Debido a que su pregunta original no devuelve nada, este comando debe ser utilizado. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html
Usa DataFrame.drop y DataFrame.drop una serie de etiquetas de índice:
In [65]: df
Out[65]:
one two
one 1 4
two 2 3
three 3 2
four 4 1
In [66]: df.drop(df.index[[1,3]])
Out[66]:
one two
one 1 4
three 3 2