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?

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

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


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 .




3

Anda juga dapat menggunakan kode ini:

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

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.