Tôi có một kịch bản trong đó người dùng muốn áp dụng một số bộ lọc cho đối tượng Pandas DataFrame hoặc Series. Về cơ bản, tôi muốn kết nối một cách hiệu quả một loạt các bộ lọc (hoạt động so sánh) với nhau được chỉ định tại thời điểm chạy bởi người dùng.
Các bộ lọc nên là phụ gia (còn gọi là mỗi bộ lọc được áp dụng sẽ thu hẹp kết quả).
Tôi hiện đang sử dụng reindex()
nhưng điều này tạo ra một đối tượng mới mỗi lần và sao chép dữ liệu cơ bản (nếu tôi hiểu tài liệu chính xác). Vì vậy, điều này có thể thực sự không hiệu quả khi lọc một Series hoặc DataFrame lớn.
Tôi đang nghĩ rằng việc sử dụng apply()
, map()
hoặc một cái gì đó tương tự có thể được tốt hơn. Tôi khá mới mẻ với Pandas mặc dù vậy vẫn cố gắng quấn đầu mọi thứ.
TL; DR
Tôi muốn lấy một từ điển có dạng sau và áp dụng từng thao tác cho một đối tượng Sê-ri nhất định và trả về một đối tượng Sê-ri 'được lọc'.
relops = {'>=': [1], '<=': [1]}
Ví dụ dài
Tôi sẽ bắt đầu với một ví dụ về những gì tôi hiện có và chỉ lọc một đối tượng Sê-ri duy nhất. Dưới đây là chức năng tôi hiện đang sử dụng:
def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series
Người dùng cung cấp một từ điển với các hoạt động mà họ muốn thực hiện:
>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 0 10
1 1 11
2 2 12
>>> from operator import le, ge
>>> ops ={'>=': ge, '<=': le}
>>> apply_relops(df['col1'], {'>=': [1]})
col1
1 1
2 2
Name: col1
>>> apply_relops(df['col1'], relops = {'>=': [1], '<=': [1]})
col1
1 1
Name: col1
Một lần nữa, "vấn đề" với cách tiếp cận trên của tôi là tôi nghĩ rằng có rất nhiều sự sao chép dữ liệu có thể không cần thiết cho các bước ở giữa.
Ngoài ra, tôi muốn mở rộng điều này để từ điển được truyền vào có thể bao gồm các cột cho toán tử trên và lọc toàn bộ DataFrame dựa trên từ điển đầu vào. Tuy nhiên, tôi cho rằng mọi thứ hoạt động cho Sê-ri đều có thể dễ dàng mở rộng thành Khung dữ liệu.
df.query
và pd.eval
có vẻ như phù hợp với trường hợp sử dụng của bạn. Để biết thông tin về pd.eval()
họ các hàm, tính năng và trường hợp sử dụng của chúng, vui lòng truy cập Đánh giá biểu thức động trong gấu trúc bằng pd.eval () .