Pregunta Seleccionar columnas en un marco de datos de pandas


Tengo datos en diferentes columnas, pero no sé cómo extraerlos para guardarlos en otra variable.

index  a   b   c
1      2   3   4
2      3   4   5

Cómo selecciono 'b', 'c' y guardarlo en df1?

Lo intenté

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

Ninguno parece funcionar.


518
2017-07-01 21:03


origen


Respuestas:


Los nombres de las columnas (que son cadenas) no se pueden dividir de la manera en que lo intentó.

Aquí tienes un par de opciones. Si sabe por contexto qué variables quiere recortar, puede simplemente devolver una vista de solo esas columnas pasando una lista al __getitem__ sintaxis (el [] 's).

df1 = df[['a','b']]

Alternativamente, si importa indexarlos numéricamente y no por su nombre (digamos que su código debería hacer esto automáticamente sin conocer los nombres de las primeras dos columnas), entonces puede hacer esto en su lugar:

df1 = df.iloc[:,0:2] # Remember that Python does not slice inclusive of the ending index.

Además, debes familiarizarte con la idea de una vista en un objeto Pandas vs. una copia de ese objeto. El primero de los métodos anteriores devolverá una nueva copia en la memoria del subobjeto deseado (los cortes deseados).

A veces, sin embargo, hay convenciones de indexación en pandas que no hacen esto y en su lugar le dan una nueva variable que solo se refiere al mismo trozo de memoria que el subobjeto o corte en el objeto original. Esto sucederá con la segunda forma de indexación, para que pueda modificarla con el copy() función para obtener una copia regular. Cuando esto sucede, cambiar lo que crees que es el objeto rebanado a veces puede alterar el objeto original. Siempre es bueno estar atento a esto.

df1 = df.iloc[0,0:2].copy() # To avoid the case where changing df1 also changes df

838
2017-07-02 02:43



Asumiendo sus nombres de columna (df.columns) son ['index','a','b','c'], entonces la información que desea está en el 3ra y 4ta columnas. Si no conoce sus nombres cuando se ejecuta el script, puede hacer esto

newdf = df[df.columns[2:4]] # Remember, Python is 0-offset! The "3rd" entry is at slot 2.

Como señala EMS en su respuesta, df.ix corta las columnas un poco más concisamente, pero el .columns La interfaz de corte puede ser más natural porque utiliza la sintaxis de indexación / corte de la lista python 1-D de vanilla.

ADVERTIR: 'index' es un mal nombre para un DataFrame columna. Esa misma etiqueta también se usa para lo real df.index atributo, a Index formación. Entonces tu columna es devuelta por df['index'] y el índice real DataFrame es devuelto por df.index. Un Index es un tipo especial de Series optimizado para la búsqueda de sus valores de elementos. Para df.index es para buscar filas por su etiqueta. Ese df.columns atributo también es un pd.Index array, para buscar columnas por sus etiquetas.


67
2017-10-31 18:57



A partir de la versión 0.11.0, columnas puede ser en rodajas de la manera que trataste de usar el .loc indexador:

df.loc[:, 'C':'E']

devuelve columnas C mediante E.


Una demostración en un DataFrame generado al azar:

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
                  columns=list('ABCDEF'), 
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out: 
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

Para obtener las columnas de C a E (tenga en cuenta que, a diferencia de la división de enteros, 'E' se incluye en las columnas):

df.loc[:, 'C':'E']

Out: 
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

Lo mismo funciona para seleccionar filas basadas en etiquetas. Obtenga las filas 'R6' a 'R10' de esas columnas:

df.loc['R6':'R10', 'C':'E']

Out: 
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.loc también acepta una matriz booleana para que pueda seleccionar las columnas cuya entrada correspondiente en la matriz es True. Por ejemplo, df.columns.isin(list('BCD')) devoluciones array([False, True, True, True, False, False], dtype=bool) - Verdadero si el nombre de la columna está en la lista ['B', 'C', 'D']; Falso, de lo contrario

df.loc[:, df.columns.isin(list('BCD'))]

Out: 
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...

54
2018-04-30 12:39



In [39]: df
Out[39]: 
   index  a  b  c
0      1  2  3  4
1      2  3  4  5

In [40]: df1 = df[['b', 'c']]

In [41]: df1
Out[41]: 
   b  c
0  3  4
1  4  5

48
2017-07-08 17:55



Me doy cuenta de que esta pregunta es bastante antigua, pero en la última versión de pandas hay una manera fácil de hacer exactamente esto. Nombres de columna (que son cadenas) poder ser cortado en la forma que desee.

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)

34
2018-02-04 14:05



Puede proporcionar una lista de columnas para descartar y devolver el DataFrame con solo las columnas necesarias utilizando el drop() funcionar en un DataFrame de Pandas.

Solo digo

colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

devolvería un DataFrame con solo las columnas b y c.

los drop método está documentado aquí.


14
2017-09-03 11:30



Encontré que este método es muy útil:

# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]

Más detalles se pueden encontrar aquí


12
2018-05-02 09:41



Solo usa: seleccionará la columna byc.

df1=pd.DataFrame()
df1=df[['b','c']]

entonces puedes simplemente llamar a df1:

df1

8
2017-11-10 09:35



Si desea obtener un elemento por fila de índice y columna, puede hacerlo de la misma manera df['b'][0]. Es tan simple como puedes imaginar.

O puedes usar df.ix[0,'b'], uso mixto de índice y etiqueta.


3
2018-01-03 07:56