Tôi muốn áp dụng tỷ lệ (bằng cách sử dụng StandardScaler() từ sklearn.preprocessing) đến một khung dữ liệu gấu trúc. Đoạn mã sau trả về một mảng numpy, vì vậy tôi mất tất cả các tên cột và phân. Đây không phải là điều tôi muốn.Làm thế nào để sử dụng sklearn fit_transform với gấu trúc và trả về dataframe thay vì mảng numpy?
features = df[["col1", "col2", "col3", "col4"]]
autoscaler = StandardScaler()
features = autoscaler.fit_transform(features)
Một "giải pháp" Tôi tìm thấy trực tuyến là:
features = features.apply(lambda x: autoscaler.fit_transform(x))
Nó xuất hiện để làm việc, nhưng dẫn đến một deprecationwarning:
/usr/lib/python3.5/site -packages/sklearn/preprocessing/data.py: 583: Khấu haoCảnh báo: Chuyển mảng 1d dưới dạng dữ liệu không được chấp nhận trong 0,17 và sẽ tăng ValueError ở 0,19. Định hình lại dữ liệu của bạn bằng cách sử dụng X.reshape (-1, 1) nếu dữ liệu của bạn có một tính năng hoặc X.reshape (1, -1) nếu nó chứa một mẫu duy nhất.
do đó tôi đã cố gắng:
features = features.apply(lambda x: autoscaler.fit_transform(x.reshape(-1, 1)))
Nhưng điều này mang lại:
Traceback (cuộc gọi gần đây nhất cuối cùng): File "./analyse.py", dòng 91, trong features = features.apply (lambda x: autoscaler.fit_transform (x.reshape (-1, 1))) Tệp "/usr/lib/python3.5/site-packages/pandas/core/frame.py", dòng 3972, trong áp dụng trả về self._apply_standard (f, axis, reduce = reduce) Tệp "/usr/lib/python3.5/site-packages/pandas/core/frame.py", dòng 4081, trong _apply_standard result = self._constructor (dữ liệu = kết quả, chỉ mục = chỉ mục) Tệp "/usr/lib/python3.5/site-packages/pandas/core/frame.py", dòng 226, trong init mgr = self._init_dict (dữ liệu, chỉ mục, cột, dtype = dtype) Tệp "/usr/lib/python3.5/site-packages/pandas/core/frame.py", dòng 363, trong _init_dict dtype = dtype) Tệp "/ usr/lib/python3.5/site-packages/pandas/core/frame.py ", dòng 5163, trong _arrays_to_mgr mảng = _homogenize (mảng, chỉ mục, dtype) Tệp" /usr/lib/python3.5/site-packages/pandas /core/frame.py ", dòng 5477, trong _homogenize raise_cast_failure = False) Tệp "/usr/lib/python3.5/site-packages/pandas/core/series.py", dòng 2885, trong _sanitize_array tăng ngoại lệ ('Dữ liệu phải là 1 chiều') Ngoại lệ: Dữ liệu phải là 1 chiều
Làm cách nào để áp dụng tỷ lệ cho khung dữ liệu gấu trúc, để nguyên khung dữ liệu? Không sao chép dữ liệu nếu có thể.
Cảm ơn bạn đã trả lời, nhưng vấn đề vẫn là các hàng được đổi số khi khung dữ liệu mới được tạo từ mảng. Khung dữ liệu gốc không chứa các hàng được đánh số liên tiếp vì một số hàng đã bị xóa. Tôi cho rằng tôi cũng có thể thêm từ khóa index = [...] với các giá trị chỉ mục cũ. Nếu bạn cập nhật câu trả lời của bạn cho phù hợp tôi có thể chấp nhận nó. – louic
Tôi hy vọng chỉnh sửa sẽ giúp, tôi nghĩ trực giác của bạn về việc thiết lập các giá trị chỉ mục từ df đầu tiên là chính xác. Những con số tôi sử dụng liên tiếp ... (chỉ muốn cho bạn thấy rằng bạn có thể thiết lập lại chúng cho bất cứ thứ gì và phạm vi (10,20) là tốt nhất mà tôi có thể nghĩ đến, nhưng nó sẽ hoạt động với bất kỳ chỉ số ngẫu nhiên nào trên df ban đầu HTH! – Kevin
Cảm ơn Kevin! – louic