2016-03-01 30 views
11

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ể.

Trả lời

19

Bạn có thể chuyển đổi DataFrame thành mảng kết hợp bằng cách sử dụng as_matrix(). Ví dụ về một tập dữ liệu ngẫu nhiên:

Edit: Thay đổi as_matrix()-values, (nó không thay đổi kết quả) mỗi câu cuối cùng của as_matrix() tài liệu trên:

Nói chung, nó được khuyến khích để sử dụng '.values'.

import pandas as pd 
import numpy as np #for the random integer example 
df = pd.DataFrame(np.random.randint(0.0,100.0,size=(10,4)), 
       index=range(10,20), 
       columns=['col1','col2','col3','col4'], 
       dtype='float64') 

Lưu ý, chỉ số là 10-19:

In [14]: df.head(3) 
Out[14]: 
    col1 col2 col3 col4 
    10 3 38 86 65 
    11 98 3 66 68 
    12 88 46 35 68 

Bây giờ fit_transform các DataFrame để có được những scaled_featuresarray:

from sklearn.preprocessing import StandardScaler 
scaled_features = StandardScaler().fit_transform(df.values) 

In [15]: scaled_features[:3,:] #lost the indices 
Out[15]: 
array([[-1.89007341, 0.05636005, 1.74514417, 0.46669562], 
     [ 1.26558518, -1.35264122, 0.82178747, 0.59282958], 
     [ 0.93341059, 0.37841748, -0.60941542, 0.59282958]]) 

Gán dữ liệu chỉnh tỷ lệ đến DataFrame (Lưu ý : sử dụng các đối số từ khóa indexcolumns để giữ cho chỉ số iginal và tên cột:

scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns) 

In [17]: scaled_features_df.head(3) 
Out[17]: 
    col1 col2 col3 col4 
10 -1.890073 0.056360 1.745144 0.466696 
11 1.265585 -1.352641 0.821787 0.592830 
12 0.933411 0.378417 -0.609415 0.592830 

Chỉnh sửa 2:

Came qua gói sklearn-pandas. Nó tập trung vào việc học scikit-dễ dàng hơn để sử dụng với gấu trúc. sklearn-pandas đặc biệt hữu ích khi bạn cần áp dụng nhiều loại chuyển đổi cho các tập con cột của DataFrame, một trường hợp phổ biến hơn. Đó là tài liệu, nhưng đây là cách bạn sẽ đạt được sự biến đổi mà chúng tôi vừa thực hiện.

from sklearn_pandas import DataFrameMapper 

mapper = DataFrameMapper([(df.columns, StandardScaler())]) 
scaled_features = mapper.fit_transform(df.copy(), 4) 
scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns) 
+1

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

+0

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

+0

Cảm ơn Kevin! – louic

Các vấn đề liên quan