ฉันมีดาต้าเฟรมแพนด้าที่มีคอลัมน์ประเภทผสมและฉันต้องการใช้ min_max_scaler ของ 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
ฉันสงสัยว่านี่เป็นวิธีที่ดีที่สุดในการเปลี่ยนแปลงนี้หรือไม่ มีวิธีใช้ df.apply ที่จะดีกว่าไหม
ฉันแปลกใจเหมือนกันที่ไม่สามารถใช้รหัสต่อไปนี้ได้:
bad_output = min_max_scaler.fit_transform(dfTest['A'])
ถ้าฉันส่งดาต้าเฟรมทั้งหมดไปยังสเกลเลอร์มันใช้งานได้:
dfTest2 = dfTest.drop('C', axis = 1)
good_output = min_max_scaler.fit_transform(dfTest2)
good_output
ฉันสับสนว่าทำไมการส่งซีรีส์ไปยังสเกลเลอร์จึงล้มเหลว ในรหัสการทำงานทั้งหมดของฉันด้านบนฉันหวังว่าจะส่งชุดข้อมูลไปยังเครื่องชั่งจากนั้นตั้งค่าคอลัมน์ dataframe = เป็นชุดที่ปรับขนาด ฉันเคยเห็นคำถามนี้ถามที่อื่น ๆ สองสามแห่ง แต่ยังไม่พบคำตอบที่ดี ความช่วยเหลือใด ๆ ที่เข้าใจว่าเกิดอะไรขึ้นที่นี่จะได้รับการชื่นชมอย่างมาก!
bad_output = in_max_scaler.fit_transform(dfTest['A'].values)
ไม่ได้ผลเช่นกัน @larsmans - ใช่ฉันเคยคิดที่จะไปตามเส้นทางนี้ดูเหมือนจะยุ่งยาก ฉันไม่รู้ว่าเป็นบั๊กหรือไม่ที่ Pandas สามารถส่งผ่าน dataframe แบบเต็มไปยังฟังก์ชัน sklearn ได้ แต่ไม่ใช่ซีรี่ส์ ความเข้าใจของฉันเกี่ยวกับ dataframe คือมันเป็นซีรีส์ การอ่านในหนังสือ "Python for Data Analysis" ระบุว่าแพนด้าถูกสร้างขึ้นด้านบนของ numpy เพื่อให้ง่ายต่อการใช้งานในการประยุกต์ใช้ NumPy เป็นศูนย์กลาง
bad_output = min_max_scaler.fit_transform(dfTest['A'].values)
? การเข้าถึงvalues
แอตทริบิวต์จะส่งคืนอาร์เรย์ numpy ด้วยเหตุผลบางอย่างบางครั้ง scikit learn api จะเรียกวิธีการที่ถูกต้องซึ่งทำให้ pandas ส่งคืนอาร์เรย์ numpy และบางครั้งก็ไม่ได้