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 là tôi muốn thực hiện những biến đổi này tại chỗ, nhưng vẫn chưa tìm ra cách để làm điều đó. Tôi đã viết đoạn mã sau hoạt động:
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ò liệu đây có phải là cách ưa thích / 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ẽ tốt hơn không?
Tôi cũng ngạc nhiên khi tôi không thể làm cho đoạn mã sau hoạt động:
bad_output = min_max_scaler.fit_transform(dfTest['A'])
Nếu tôi chuyển toàn bộ khung dữ liệu cho bộ chia tỷ lệ thì nó hoạt động:
dfTest2 = dfTest.drop('C', axis = 1)
good_output = min_max_scaler.fit_transform(dfTest2)
good_output
Tôi bối rối tại sao vượt qua một loạt để mở rộng 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 truyền một chuỗi cho bộ chia tỷ lệ sau đó đặt cột dataframe = cho chuỗi được chia tỷ lệ. Tôi đã 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ỳ trợ giúp để hiểu những gì đang xảy ra ở đây sẽ được đánh giá rất cao!
bad_output = in_max_scaler.fit_transform(dfTest['A'].values)
cũng không hoạt động. @larsmans - vâng tôi đã nghĩ về việc đi xuống tuyến đường này, nó có vẻ như là một rắc rối. Tôi không biết đó có phải là lỗi hay không mà Pandas có thể truyền toàn bộ khung dữ liệu cho hàm sklearn, nhưng không phải là một chuỗi. Sự hiểu biết của tôi về một khung dữ liệu là nó là một chuỗi của chuỗi. Đọ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 đỉnh của numpy để làm cho nó dễ sử dụng trong các ứng dụng NumPy-centric.
bad_output = min_max_scaler.fit_transform(dfTest['A'].values)
? truy cậpvalues
thuộc tính trả về một mảng numpy, vì một số lý do, đôi khi api học scikit sẽ gọi đúng phương thức làm cho gấu trúc trả về một mảng numpy và đôi khi không.