Cortando múltiples rangos de columnas en Pandas, por lista de nombres

Estoy tratando de seleccionar varias columnas en un dataframe de Pandas en dos enfoques diferentes:

1) a través del número de columnas, por ejemplo, columnas 1-3 y columnas 6 en adelante.

y

2) a través de una lista de nombres de columna, por ejemplo:

years = list(range(2000,2017)) months = list(range(1,13)) years_month = list(["A", "B", "B"]) for y in years: for m in months: y_m = str(y) + "-" + str(m) years_month.append(y_m) 

Entonces, years_month produciría lo siguiente:

 ['A', 'B', 'C', '2000-1', '2000-2', '2000-3', '2000-4', '2000-5', '2000-6', '2000-7', '2000-8', '2000-9', '2000-10', '2000-11', '2000-12', '2001-1', '2001-2', '2001-3', '2001-4', '2001-5', '2001-6', '2001-7', '2001-8', '2001-9', '2001-10', '2001-11', '2001-12'] 

Dicho esto, ¿cuál es la mejor (o correcta) forma de cargar solo las columnas en las que los nombres están en la lista años_mésimo mes en los dos enfoques?

Creo que necesita numpy.r_ para las posiciones concanecadas de las columnas, luego use iloc para seleccionar:

 print (df.iloc[:, np.r_[1:3, 6:len(df.columns)]]) 

y para segundo subgrupo de aproximación por list :

 print (df[years_month]) 

Muestra:

 df = pd.DataFrame({'2000-1':[1,3,5], '2000-2':[5,3,6], '2000-3':[7,8,9], '2000-4':[1,3,5], '2000-5':[5,3,6], '2000-6':[7,8,9], '2000-7':[1,3,5], '2000-8':[5,3,6], '2000-9':[7,4,3], 'A':[1,2,3], 'B':[4,5,6], 'C':[7,8,9]}) print (df) 2000-1 2000-2 2000-3 2000-4 2000-5 2000-6 2000-7 2000-8 2000-9 A \ 0 1 5 7 1 5 7 1 5 7 1 1 3 3 8 3 3 8 3 3 4 2 2 5 6 9 5 6 9 5 6 3 3 BC 0 4 7 1 5 8 2 6 9 print (df.iloc[:, np.r_[1:3, 6:len(df.columns)]]) 2000-2 2000-3 2000-7 2000-8 2000-9 ABC 0 5 7 1 5 7 1 4 7 1 3 8 3 3 4 2 5 8 2 6 9 5 6 3 3 6 9 

También puede sumr ranges (es necesario convertir a la list en python 3 ):

 rng = list(range(1,3)) + list(range(6, len(df.columns))) print (rng) [1, 2, 6, 7, 8, 9, 10, 11] print (df.iloc[:, rng]) 2000-2 2000-3 2000-7 2000-8 2000-9 ABC 0 5 7 1 5 7 1 4 7 1 3 8 3 3 4 2 5 8 2 6 9 5 6 3 3 6 9 

No estoy seguro de qué es exactamente lo que está preguntando, pero en general DataFrame.loc permite seleccionar por etiqueta, DataFrame.iloc por índice.

Por ejemplo seleccionando columnas # 0, 1 y 4:

 dataframe.iloc[:, [0, 1, 4]] 

y seleccionando las columnas etiquetadas ‘A’, ‘B’ y ‘C’:

 dataframe.loc[:, ['A', 'B', 'C']]