Encontré la documentación para pandas.DataFrame.pop , pero después de probarlo y examinar el código fuente , parece que no hace lo que quiero.
Si hago un marco de datos como este:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(10,6)) # Make a few areas have NaN values df.iloc[1:3,1] = np.nan df.iloc[5,3] = np.nan df.iloc[7:9,5] = np.nan >>> df 0 1 2 3 4 5 0 0.772762 -0.442657 1.245988 1.102018 -0.740836 1.685598 1 -0.387922 NaN -1.215723 -0.106875 0.499110 0.338759 2 0.567631 NaN -0.353032 -0.099011 -0.698925 -1.348966 3 1.320849 1.084405 -1.296177 0.681111 -1.941855 -0.950346 4 -0.026818 -1.933629 -0.693964 1.116673 0.392217 1.280808 5 -1.249192 -0.035932 -1.330916 NaN -0.135720 -0.506016 6 0.406344 1.416579 0.122019 0.648851 -0.305359 -1.253580 7 -0.092440 -0.243593 0.468463 -1.689485 0.667804 NaN 8 -0.110819 -0.627777 -0.302116 0.630068 2.567923 NaN 9 1.884069 -0.393420 -0.950275 0.151182 -1.122764 0.502117 Si quiero eliminar las filas seleccionadas y asignarlas a un objeto separado en un solo paso, me gustaría un comportamiento pop como este:
# rows in column 5 which have NaN values >>> df[df[5].isnull()].index Int64Index([7, 8], dtype='int64') # remove them from the dataframe, assign them to a separate object >>> nan_rows = df.pop(df[df[5].isnull()].index)Sin embargo, esto no parece ser compatible. En cambio, parece que me veo obligado a hacer esto en dos pasos separados, lo que parece un poco poco elegante.
# get the NaN rows >>> nan_rows = df[df[5].isnull()] >>> nan_rows 0 1 2 3 4 5 7 -0.092440 -0.243593 0.468463 -1.689485 0.667804 NaN 8 -0.110819 -0.627777 -0.302116 0.630068 2.567923 NaN # remove from orignal df >>> df = df.drop(nan_rows.index) >>> df 0 1 2 3 4 5 0 0.772762 -0.442657 1.245988 1.102018 -0.740836 1.685598 1 -0.387922 NaN -1.215723 -0.106875 0.499110 0.338759 2 0.567631 NaN -0.353032 -0.099011 -0.698925 -1.348966 3 1.320849 1.084405 -1.296177 0.681111 -1.941855 -0.950346 4 -0.026818 -1.933629 -0.693964 1.116673 0.392217 1.280808 5 -1.249192 -0.035932 -1.330916 NaN -0.135720 -0.506016 6 0.406344 1.416579 0.122019 0.648851 -0.305359 -1.253580 9 1.884069 -0.393420 -0.950275 0.151182 -1.122764 0.502117¿Hay un método de un solo paso incorporado? ¿O es así como 'se supone' que debes hacerlo?
Como puede hacer estallar columnas, puede tomar la transposición del marco de datos y hacer estallar sus columnas, es decir. las filas del df original así. Aquí está el df original.
import numpy as np df = pd.DataFrame(np.random.randint(0, 10, size=(3, 3)), columns = ['a', 'b', 'c']) print(df) abc 0 4 9 4 1 5 5 8 2 5 7 4Luego toma la transposición y extrae la columna 0, que es la fila 0 del df original.
df_t = df.T popped_row = df_t.pop(0)Ahora tienes la fila emergente
print(popped_row) a 4 b 9 c 4 Name: 0, dtype: int32Y luego tienes el marco de datos original sin la primera fila.
df = df_t.T print(df) abc 1 5 5 8 2 5 7 4código fuente emergente:
def pop(self, item): """ Return item and drop from frame. Raise KeyError if not found. """ result = self[item] del self[item] try: result._reset_cacher() except AttributeError: pass return result File: c:\python\lib\site-packages\pandas\core\generic.py
del definitivamente no funcionará si item no es un nombre de columna simple. Pase un nombre de columna simple o hágalo en dos pasos.