Tôi có một khung dữ liệu gấu trúc với các cột loại hỗn hợp và tôi muốn áp dụng min_max_scaler của sklearn cho một số cột. Lý tưởng nhất, tôi muốn thực hiện các phép biến đổi này tại chỗ, nhưng chưa tìm ra cách để làm điều đó. Tôi đã viết mã sau hoạt động:pandas dataframe cột mở rộng với sklearn
import pandas as pd
import numpy as np
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()
dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
min_max_scaler = preprocessing.MinMaxScaler()
def scaleColumns(df, cols_to_scale):
for col in cols_to_scale:
df[col] = pd.DataFrame(min_max_scaler.fit_transform(pd.DataFrame(dfTest[col])),columns=[col])
return df
dfTest
A B C
0 14.00 103.02 big
1 90.20 107.26 small
2 90.95 110.35 big
3 96.27 114.23 small
4 91.21 114.68 small
scaled_df = scaleColumns(dfTest,['A','B'])
scaled_df
A B C
0 0.000000 0.000000 big
1 0.926219 0.363636 small
2 0.935335 0.628645 big
3 1.000000 0.961407 small
4 0.938495 1.000000 small
Tôi tò mò nếu đây là cách tốt nhất/hiệu quả nhất để thực hiện chuyển đổi này. Có cách nào tôi có thể sử dụng df.apply đó sẽ là tốt hơn?
Tôi cũng ngạc nhiên khi tôi không thể lấy mã sau đây để làm việc:
bad_output = min_max_scaler.fit_transform(dfTest['A'])
Nếu tôi vượt qua toàn bộ một dataframe để scaler nó hoạt động:
dfTest2 = dfTest.drop('C', axis = 1) good_output = min_max_scaler.fit_transform(dfTest2) good_output
Tôi đang bối rối tại sao vượt qua một loạt các scaler thất bại. Trong mã làm việc đầy đủ của tôi ở trên tôi đã hy vọng chỉ cần vượt qua một loạt để scaler sau đó thiết lập cột dataframe = để loạt thu nhỏ. Tôi đã nhìn thấy câu hỏi này hỏi một vài nơi khác, nhưng không tìm thấy câu trả lời hay. Bất kỳ sự trợ giúp nào hiểu được những gì đang xảy ra ở đây sẽ được đánh giá cao!
Liệu nó có tác dụng nếu bạn làm điều này 'bad_output = min_max_scaler.fit_transform (dfTest [ 'A'] giá trị.) '? việc truy cập thuộc tính 'values' trả về một mảng có nhiều mảng, vì một số lý do đôi khi scikit tìm hiểu api sẽ gọi đúng phương thức làm cho gấu trúc trả về một mảng có nhiều mảng và đôi khi nó không thành công. – EdChum
Các khung dữ liệu của Pandas là các đối tượng khá phức tạp với các quy ước không phù hợp với quy ước của scikit-learn. Nếu bạn chuyển đổi mọi thứ thành các mảng NumPy, việc học bằng scikit sẽ dễ dàng hơn nhiều khi làm việc. –
@edChum - 'bad_output = in_max_scaler.fit_transform (giá trị dfTest ['A'].)' Cũng không hoạt động. @ larsmans - vâng tôi đã nghĩ về việc đi xuống con đường này, nó chỉ có vẻ như một rắc rối. Tôi không biết nếu nó là một lỗi hay không mà Pandas có thể vượt qua một dataframe đầy đủ đến một chức năng sklearn, nhưng không phải là một loạt. Sự hiểu biết của tôi về một dataframe là nó là một dict của series.Đọc trong cuốn sách "Python để phân tích dữ liệu", nó nói rằng gấu trúc được xây dựng trên đầu trang của numpy để làm cho nó dễ sử dụng trong các ứng dụng NumPy-centric. – flyingmeatball