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?
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:
df.columns
renvoie une liste de noms de colonnes[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
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']
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
Vous pouvez aussi utiliser ce code:
spike_cols =[x for x in df.columns[df.columns.str.contains('spike')]]