Adı belirli bir dize içeren sütunu bulun


139

Sütun adlarına sahip bir veri çerçevem ​​var ve belirli bir dizeyi içeren ancak onunla tam olarak eşleşmeyen birini bulmak istiyorum. Arıyorum 'spike'sütun adları gibi içinde 'spike-2', 'hey spike', 'spiked-in'( 'spike'kısmı her zaman süreklidir).

Sütun adının bir dizge veya değişken olarak döndürülmesini istiyorum, bu nedenle sütuna daha sonra df['name']veya df[name]normal olarak erişiyorum . Bunu yapmanın yollarını bulmaya çalıştım, boşuna. Herhangi bir ipucu?

Yanıtlar:


230

Sadece tekrarlayın DataFrame.columns, şimdi bu, eşleşen sütun adlarının bir listesini bulacağınız bir örnek:

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)

Çıktı:

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

Açıklama:

  1. df.columns sütun adlarının bir listesini döndürür
  2. [col for col in df.columns if 'spike' in col]df.columnsdeğişkenle birlikte listeyi yineler colve eğer coliçeriyorsa , sonuç listeye ekler 'spike'. Bu sözdizimi, listeyi anlamadır .

Yalnızca eşleşen sütunlarla elde edilen veri kümesini istiyorsanız, bunu yapabilirsiniz:

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

Çıktı:

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

1
Bu harika! Yine de nasıl çalıştığını tam olarak anlamıyorum, yine de hem Python hem de Pandalar için yeniyim. Belki açıklayabilir misin?
erikfas

16
bu nedir DataFrame.filter(isterseniz ve bir regex sağlayabilmektedir) Bilginize yapar
Jeff

2
@xndrme belirli bir sütunu dahil etmek yerine normal ifadeyle eşleşen belirli bir sütunu hariç tutmak için nasıl bir normal ifade yaparsınız ?
Dhruv Ghulati

3
@DhruvGhulati İstenmeyen sütunlarınızı olduğu gibi bırakmanız da mümkündür df[df.columns.drop(spike_cols)], burada istenmeyen regex'lerinizi kullanarak elde edebileceğiniz DataFramelistedeki sütunlar olmadan bir tane spike_colselde edersiniz.
Alvaro Fuentes

1
daha kısa kod:df[[col for col in df.columns if "spike" in col]]
WindChimes

71

Bu cevap , listeyi anlama olmadan bunu yapmak için DataFrame.filter yöntemini kullanır:

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)

Yalnızca 'spike-2' çıktı verir. Yukarıdaki yorumlarda bazı kişilerin önerdiği gibi normal ifadeyi de kullanabilirsiniz:

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

Her iki sütunu da çıkarır: ['spike-2', 'hey spke']


22

Ayrıca kullanabilirsiniz 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)

Bu, sütun adlarını verir: 'spike-2', 'spiked-in'

Pandas.Series.str.contains hakkında daha fazla bilgi .




3

Bu kodu da kullanabilirsiniz:

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

0

Başlangıç, İçerir ve Sona göre ad ve alt küme oluşturma:

# 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.