Temukan kolom yang namanya berisi string tertentu

137

Saya memiliki kerangka data dengan nama kolom, dan saya ingin menemukan yang berisi string tertentu, tetapi tidak sama persis dengan itu. Aku mencari 'spike'di kolom nama seperti 'spike-2', 'hey spike', 'spiked-in'(yang 'spike'bagian selalu terus-menerus).

Saya ingin nama kolom dikembalikan sebagai string atau variabel, jadi saya mengakses kolom nanti dengan df['name']atau df[name]seperti biasa. Saya sudah mencoba menemukan cara untuk melakukan ini, tetapi tidak berhasil. Ada tips?

erikfas
sumber

Jawaban:

229

Hanya beralih lagi DataFrame.columns, sekarang ini adalah contoh di mana Anda akan berakhir dengan daftar nama kolom yang cocok:

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)

Keluaran:

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

Penjelasan:

  1. df.columns mengembalikan daftar nama kolom
  2. [col for col in df.columns if 'spike' in col]beralih ke daftar df.columnsdengan variabel coldan menambahkannya ke daftar yang dihasilkan jika colberisi 'spike'. Sintaks ini adalah pemahaman daftar .

Jika Anda hanya ingin kumpulan data yang dihasilkan dengan kolom yang cocok Anda dapat melakukan ini:

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

Keluaran:

   spike-2  spiked-in
0        1          7
1        2          8
2        3          9
Alvaro Fuentes
sumber
1
Itu luar biasa! Saya tidak benar-benar mengerti persis cara kerjanya, meskipun, masih baru untuk Python dan Pandas. Bisakah Anda menjelaskan?
erikfas
16
inilah yang DataFrame.filterdilakukan FYI (dan Anda dapat menyediakan regex jika Anda mau)
Jeff
2
@ xndrme bagaimana Anda melakukan regex untuk mengecualikan kolom tertentu yang cocok dengan regex alih-alih menyertakan
Dhruv Ghulati
3
@ DhruvGhulati Dimungkinkan juga untuk menjatuhkan kolom yang tidak diinginkan seperti di df[df.columns.drop(spike_cols)], di sana Anda mendapatkan DataFrametanpa kolom dalam daftar spike_colsyang bisa Anda peroleh menggunakan regex yang tidak diinginkan.
Alvaro Fuentes
1
kode yang lebih ringkas:df[[col for col in df.columns if "spike" in col]]
WindChimes
71

Jawaban ini menggunakan metode DataFrame.filter untuk melakukan ini tanpa pemahaman daftar:

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)

Akan menampilkan hanya 'spike-2'. Anda juga dapat menggunakan regex, seperti yang disarankan beberapa orang di komentar di atas:

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

Akan menampilkan kedua kolom: ['spike-2', 'hey spke']

Ben
sumber
22

Anda juga bisa menggunakan 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)

Ini akan menampilkan nama kolom: 'spike-2', 'spiked-in'

Lebih lanjut tentang pandas.Series.str.contains .

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

Anda juga dapat memilih berdasarkan nama, ekspresi reguler. Rujuk ke: pandas.DataFrame.filter

Manny
sumber
1
Solusi termudah sejauh ini. Sederhana namun kuat!
Cesare Iurlaro
7
df.loc[:,df.columns.str.contains("spike")]
DhanushNayak
sumber
3

Anda juga dapat menggunakan kode ini:

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

Mendapatkan nama dan subset berdasarkan Mulai, Berisi, dan Berakhir:

# 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
sumber