Buscar columna cuyo nombre contiene una cadena específica

Tengo un dataframe con nombres de columna, y quiero encontrar el que contiene una cadena determinada, pero que no coincide exactamente. Estoy buscando 'spike' en nombres de columna como 'spike-2' , 'hey spike' , 'spiked-in' (la parte 'spike' es siempre continua).

Quiero que el nombre de la columna se devuelva como una cadena o variable, por lo que accedo a la columna más adelante con df['name'] o df[name] como es normal. He tratado de encontrar maneras de hacer esto, en vano. ¿Algun consejo?

Solo iterar sobre DataFrame.columns , ahora este es un ejemplo en el que terminará con una lista de nombres de columnas que coinciden:

 import pandas as pd data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]} df = pd.DataFrame(data) spike_cols = [col for col in df.columns if 'spike' in col] print(list(df.columns)) print(spike_cols) 

Salida:

 ['hey spke', 'no', 'spike-2', 'spiked-in'] ['spike-2', 'spiked-in'] 

Explicación:

  1. df.columns devuelve una lista de nombres de columna
  2. [col for col in df.columns if 'spike' in col] itera sobre la lista df.columns con la variable col y la agrega a la lista resultante si col contiene 'spike' . Esta syntax es la lista de comprensión .

Si solo desea el conjunto de datos resultante con las columnas que coinciden, puede hacer esto:

 df2 = df.filter(regex='spike') print(df2) 

Salida:

  spike-2 spiked-in 0 1 7 1 2 8 2 3 9 

Esta respuesta utiliza el método DataFrame.filter para hacer esto sin comprender la lista:

 import pandas as pd data = {'spike-2': [1,2,3], 'hey spke': [4,5,6]} df = pd.DataFrame(data) print(df.filter(like='spike').columns) 

Saldrá solo ‘spike-2’. También puede usar expresiones regulares, como algunas personas sugirieron en los comentarios anteriores:

 print(df.filter(regex='spike|spke').columns) 

Producirá ambas columnas: [‘spike-2’, ‘hey spke’]

También puede usar df.columns[df.columns.str.contains(pat = 'spike')]

 data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]} df = pd.DataFrame(data) colNames = df.columns[df.columns.str.contains(pat = 'spike')] print(colNames) 

Esto mostrará los nombres de las columnas: 'spike-2', u'spiked-in'

Más sobre pandas.Series.str.contains .

 # select columns containing 'spike' df.filter(like='spike', axis=1) 

También puede seleccionar por nombre, expresión regular. Consulte: pandas.DataFrame.filter

También puedes usar este código:

 spike_cols =[x for x in df.columns[df.columns.str.contains('spike')]]