Rechercher une colonne dont le nom contient une chaîne spécifique

138

J'ai un dataframe avec des noms de colonnes et je veux trouver celui qui contient une certaine chaîne, mais qui ne la correspond pas exactement. Je cherche 'spike'dans les noms de colonnes aiment 'spike-2', 'hey spike', 'spiked-in'(la 'spike'partie est toujours en continu).

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

erikfas
la source

Réponses:

230

Répétez simplement, voici DataFrame.columnsmaintenant un exemple dans lequel vous vous retrouverez avec une liste de noms de colonnes qui correspondent:

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)

Production:

['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]itère sur la liste df.columnsavec la variable colet l'ajoute à la liste résultante si colcontient 'spike'. Cette syntaxe est la compréhension de liste .

Si vous ne voulez que l'ensemble de données résultant avec les colonnes qui correspondent, vous pouvez le faire:

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

Production:

   spike-2  spiked-in
0        1          7
1        2          8
2        3          9
Alvaro Fuentes
la source
1
C'est génial! Je ne comprends pas vraiment comment cela fonctionne, cependant, étant encore nouveau à la fois pour Python et Pandas. Pourriez-vous peut-être expliquer?
erikfas
16
c'est ce que DataFrame.filterfait FYI (et vous pouvez fournir une regex si vous le souhaitez)
Jeff
2
@xndrme comment feriez-vous une regex pour exclure une certaine colonne correspondant à une regex au lieu d'inclure?
Dhruv Ghulati
3
@DhruvGhulati Il est également possible de supprimer vos colonnes indésirables comme dans df[df.columns.drop(spike_cols)], là vous obtenez un DataFramesans les colonnes dans la liste spike_colsque vous pouvez obtenir en utilisant votre regex indésirable.
Alvaro Fuentes
1
code plus concis:df[[col for col in df.columns if "spike" in col]]
WindChimes
71

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

Sortira juste «pic-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)

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

Ben
la source
22

Vous pouvez aussi 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 affichera les noms de colonne: 'spike-2', 'spiked-in'

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

Michael James Kali Galarnyk
la source
18
# select columns containing 'spike'
df.filter(like='spike', axis=1)

Vous pouvez également sélectionner par nom, expression régulière. Reportez-vous à: pandas.DataFrame.filter

Manny
la source
1
Solution la plus simple à ce jour. Simple mais puissant!
Cesare Iurlaro
7
df.loc[:,df.columns.str.contains("spike")]
DhanushNayak
la source
3

Vous pouvez également utiliser ce code:

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

Obtention du nom et du sous-ensemble en fonction de Début, Contient et Fin:

# from: /programming/21285380/find-column-whose-name-contains-a-specific-string
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
# from: https://cmdlinetips.com/2019/04/how-to-select-columns-using-prefix-suffix-of-column-names-in-pandas/
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html




import pandas as pd



data = {'spike_starts': [1,2,3], 'ends_spike_starts': [4,5,6], 'ends_spike': [7,8,9], 'not': [10,11,12]}
df = pd.DataFrame(data)



print("\n")
print("----------------------------------------")
colNames_contains = df.columns[df.columns.str.contains(pat = 'spike')].tolist() 
print("Contains")
print(colNames_contains)



print("\n")
print("----------------------------------------")
colNames_starts = df.columns[df.columns.str.contains(pat = '^spike')].tolist() 
print("Starts")
print(colNames_starts)



print("\n")
print("----------------------------------------")
colNames_ends = df.columns[df.columns.str.contains(pat = 'spike$')].tolist() 
print("Ends")
print(colNames_ends)



print("\n")
print("----------------------------------------")
df_subset_start = df.filter(regex='^spike',axis=1)
print("Starts")
print(df_subset_start)



print("\n")
print("----------------------------------------")
df_subset_contains = df.filter(regex='spike',axis=1)
print("Contains")
print(df_subset_contains)



print("\n")
print("----------------------------------------")
df_subset_ends = df.filter(regex='spike$',axis=1)
print("Ends")
print(df_subset_ends)
vasili111
la source