web-dev-qa-db-fra.com

Pandas: rechercher une colonne dont le nom contient une chaîne spécifique

J'ai donc un cadre de données avec des noms de colonnes et je souhaite trouver celui qui contient une certaine chaîne, mais ne lui correspond pas exactement. Je recherche 'spike' dans des noms de colonne tels que 'spike-2', 'hey spike', 'spiked-in' (la partie 'spike' est toujours continue). 

Je veux que le nom de la colonne soit renvoyé sous forme de chaîne ou de variable. Je vais donc accéder à la colonne plus tard avec df['name'] ou df[name] comme d'habitude. J'ai essayé de trouver des moyens de le faire, mais en vain. Des conseils?

77
erikfas

Il suffit de parcourir DataFrame.columns, voici maintenant un exemple dans lequel vous obtiendrez une liste de noms de colonnes correspondant à:

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)

Sortie:

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

Explication:

  1. df.columns renvoie une liste de noms de colonnes
  2. [col for col in df.columns if 'spike' in col] parcourt la liste df.columns avec la variable col et l'ajoute à la liste résultante si col contient 'spike'. Cette syntaxe est compréhension de la liste

Si vous voulez seulement le jeu de données résultant avec les colonnes correspondantes, vous pouvez le faire:

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

Sortie:

   spike-2  spiked-in
0        1          7
1        2          8
2        3          9
139
Alvaro Fuentes

Cette réponse utilise la méthode DataFrame.filter pour ce faire sans compréhension de la 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)

Va sortir juste 'spike-2'. Vous pouvez également utiliser regex, comme certaines personnes l'ont suggéré dans les commentaires ci-dessus:

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

Produira les deux colonnes: ['spike-2', 'hey spke']

33
Ben

Vous pouvez également utiliser 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)

Cela produira les noms de colonne: 'spike-2', u'spiked-in'

En savoir plus sur pandas.Series.str.contains .

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

Vous pouvez également sélectionner par nom, expression régulière. Voir: pandas.DataFrame.filter

3
Manny

Vous pouvez aussi utiliser ce code:

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