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?

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

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']


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 .


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


1
Solution la plus simple à ce jour. Simple mais puissant!
Cesare Iurlaro


3

Vous pouvez également utiliser ce code:

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

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.