Python 3.x 如何在包含numpy.ndarrays的列/列的数据帧上执行StandardScaler?
我有一个pandas数据框,其中有些列带有numpy.ndarrays:Python 3.x 如何在包含numpy.ndarrays的列/列的数据帧上执行StandardScaler?,python-3.x,pandas,numpy,scikit-learn,Python 3.x,Pandas,Numpy,Scikit Learn,我有一个pandas数据框,其中有些列带有numpy.ndarrays: col1 col2 col3 col4 0 4 array([34, 56, 234]) 7 array([765, 654]) 1 3 array([11, 598, 1]) 89 array([34, 90]) 我想在上面做一些缩放 我做了相当标准的事情: from sklearn.model_selection impo
col1 col2 col3 col4
0 4 array([34, 56, 234]) 7 array([765, 654])
1 3 array([11, 598, 1]) 89 array([34, 90])
我想在上面做一些缩放
我做了相当标准的事情:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
我遇到了一个意料之中的错误:
ValueError: setting an array element with a sequence.
我需要帮助标准化这些numpy阵列以及其他一切 尝试将数组转换为数据帧。我有限的理解是,它需要使用二维阵列,而不是一维阵列
import pandas as pd
import numpy as np
X = pd.DataFrame(np.array(([34, 56, 234]))
y = pd.DataFrame(np.array([11, 598, 1]))
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
X_train
Out[38]:
array([[ 1.],
[-1.]])
StandardScaler
希望每列都有数值但col2
和col4
有序列,因此会出现错误
我认为最好分别处理带有序列的列,然后再与其余数据合并
现在,我将假设对于所有行,给定列的顺序元素数相同,例如col_2
的所有行都有3值数组
因为,StandardScaler
分别计算所有列的mean
和std
。序列列有两种方法:
方法1:序列所有位置的元素都来自相同的分布。
在这种情况下,您应该得到所有值的mean
和std
。在展平阵列上安装StandardScaler
后,将其重塑为原始形状
方法2:序列不同位置的元素来自不同的分布。
在这种情况下,可以将单个列转换为2D numpy数组。您可以在该2D数组上拟合StandardScaler
(每个列mean
和std
将分别计算),并在转换后将其恢复为单个列
以下是两种方法的代码:
# numeric columns should work as expected
X_train_1 = X_train[['col1', 'col3']]
X_test_1 = X_test[['col1', 'col3']]
sc = StandardScaler()
X_train_1 = sc.fit_transform(X_train_1)
X_test_1 = sc.transform(X_test_1)
# first convert seq column to a 2d array
X_train_col2 = np.vstack(X_train['col2'].values).astype(float)
X_test_col2 = np.vstack(X_test['col2'].values).astype(float)
# for sequence columns, there are two approaches:
# Approach 1
sc_col2 = StandardScaler()
X_train_2 = sc_col2.fit_transform(X_train_col2.flatten().reshape(-1, 1))
X_train_2 = X_train_2.reshape(X_train_col2.shape)
X_test_2 = sc_col2.transform(X_test_col2.flatten().reshape(-1, 1))
X_test_2 = X_test_2.reshape(X_test_col2.shape)
# Approach 2
sc_col2 = StandardScaler()
X_train_2 = sc_col2.fit_transform(X_train_col2)
X_test_2 = sc_col2.transform(X_test_col2)
# To assign back to dataframe, you can do following:
X_test["col2_scaled"] = X_test_2.tolist()
# To stack with other numpy arrays
X_train_scaled = np.hstack((X_train_1, X_train_2))
在方法2中,可以先堆叠所有列,然后一次性对所有列执行
StandarScaler
。谢谢您的回复!我已经准备好实现这个功能了,但是我注意到我所有的数字都不是numpy类型的。我应该将数组中的所有数字和列中的整数转换为它们的numpy等效类型吗?是的!我建议这样做。我正在编辑我的答案,以便在缩放之前将所有内容转换为浮动!