Panda: trova la colonna il cui nome contiene una stringa specifica

Quindi, ho un dataframe con i nomi delle colonne, e voglio trovare quello che contiene una certa stringa, ma non corrisponde esattamente a esso. Sto cercando 'spike' nei nomi delle colonne come 'spike-2' , 'hey spike' , 'spiked-in' (la parte 'spike' è sempre continua).

Voglio che il nome della colonna sia restituito come stringa o variabile, quindi accedo più tardi alla colonna con df['name'] o df[name] come di consueto. Ho provato a trovare modi per farlo, senza successo. Qualche consiglio?

Basta DataFrame.columns su DataFrame.columns , ora questo è un esempio in cui ti ritroverai con un elenco di nomi di colonne che corrispondono:

 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) 

Produzione:

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

Spiegazione:

  1. df.columns restituisce un elenco di nomi di colonne
  2. [col for col in df.columns if 'spike' in col] scorre sopra l’elenco df.columns con la variabile col e lo aggiunge alla lista risultante se col contiene 'spike' . Questa syntax è la comprensione delle liste .

Se si desidera solo il set di dati risultante con le colonne corrispondenti, è ansible farlo:

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

Produzione:

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

Questa risposta utilizza il metodo DataFrame.filter per eseguire questa operazione senza la comprensione delle liste:

 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) 

Produrrà solo ‘spike-2’. Puoi anche usare regex, come suggerito da alcune persone nei commenti sopra:

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

Pubblicherà entrambe le colonne: [‘spike-2’, ‘hey spke’]

Puoi anche usare 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) 

Questo produrrà i nomi delle colonne: 'spike-2', u'spiked-in'

Ulteriori informazioni su pandas.Series.str.contains .

Puoi anche usare questo codice:

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