Tìm cột có tên chứa một chuỗi cụ thể


137

Tôi có một khung dữ liệu với các tên cột và tôi muốn tìm một chuỗi chứa một chuỗi nhất định, nhưng không khớp chính xác với nó. Tôi đang tìm kiếm 'spike'trong tên cột thích 'spike-2', 'hey spike', 'spiked-in'(các 'spike'phần luôn luôn là liên tục).

Tôi muốn tên cột được trả về dưới dạng chuỗi hoặc biến, vì vậy tôi truy cập cột sau bằng df['name']hoặc df[name]như bình thường. Tôi đã cố gắng tìm mọi cách để làm điều này, nhưng không có kết quả. Bất cứ lời khuyên?

Câu trả lời:


229

Chỉ cần lặp đi lặp lại DataFrame.columns, bây giờ đây là một ví dụ trong đó bạn sẽ kết thúc với một danh sách các tên cột khớp với:

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)

Đầu ra:

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

Giải trình:

  1. df.columns trả về một danh sách các tên cột
  2. [col for col in df.columns if 'spike' in col]Lặp lại danh sách df.columnsvới biến colvà thêm nó vào danh sách kết quả nếu col'spike'. Cú pháp này là danh sách hiểu .

Nếu bạn chỉ muốn tập dữ liệu kết quả với các cột khớp với nhau, bạn có thể làm điều này:

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

Đầu ra:

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

1
Thật tuyệt vời! Tôi thực sự không hiểu chính xác cách thức hoạt động của nó, tuy nhiên, vẫn còn mới đối với cả Python và Pandas. Có lẽ bạn có thể giải thích?
erikfas

16
đây là những gì DataFrame.filterFYI (và bạn có thể cung cấp một regex nếu bạn muốn)
Jeff

2
@xndrme bạn sẽ làm một regex như thế nào để loại trừ một cột nhất định khớp với một regex thay vì bao gồm?
Dhruv Ghulati

3
@DhruvGhulati Cũng có thể bỏ các cột không mong muốn của bạn như trong df[df.columns.drop(spike_cols)], ở đó bạn nhận được DataFramemà không có các cột trong danh sách spike_colsmà bạn có thể có được bằng cách sử dụng regex không mong muốn của mình.
Alvaro Fuentes

1
mã ngắn gọn hơn:df[[col for col in df.columns if "spike" in col]]
WindChimes

71

Câu trả lời này sử dụng phương thức DataFrame.filter để thực hiện điều này mà không cần hiểu danh sách:

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)

Sẽ chỉ xuất ra 'spike-2'. Bạn cũng có thể sử dụng regex, như một số người đề xuất trong các nhận xét ở trên:

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

Sẽ xuất cả hai cột: ['spike-2', 'hey spke']


22

Bạn cũng có thể dùng 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)

Điều này sẽ xuất tên cột: 'spike-2', 'spiked-in'

Thêm thông tin về gấu trúc.Series.str.contains .


18
# select columns containing 'spike'
df.filter(like='spike', axis=1)

Bạn cũng có thể chọn theo tên, biểu thức thông thường. Tham khảo: pandas.DataFrame.filter


1
Giải pháp dễ nhất cho đến nay. Đơn giản nhưng mạnh mẽ!
Cesare Iurlaro


3

Bạn cũng có thể sử dụng mã này:

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

0

Lấy tên và đặt lại dựa trên Bắt đầu, Chứa và Kết thúc:

# 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.