gpt4 book ai didi

python-3.x - 如何使用包含 numpy.ndarrays 的列/列对 pandas 数据框执行 StandardScaler?

转载 作者:行者123 更新时间:2023-12-05 03:59:14 25 4
gpt4 key购买 nike

我有一个 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 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 数组以及其他一切!

最佳答案

StandardScaler 期望每一列都有numeric 值,但是col2col4 有序列,因此会出现错误。

我认为最好分别处理带有序列的列,然后再与其余数据组合回去。

现在,我假设所有行都没有。给定列的顺序元素相同,例如col_2 的所有行都有 3 个值数组。

因为,StandardScaler 单独计算所有列的meanstd。序列列有两种方法:

方法一:序列所有位置的元素来自同一个分布。

在这种情况下,您应该得到所有值的 meanstd。在扁平阵列上安装 StandardScaler 后,将其 reshape 回原始形状。

方法二:序列不同位置的元素来自不同的分布。

在这种情况下,可以将单个列转换为二维 numpy 数组。您可以在该二维数组上安装 StandardScaler(每列 meanstd 将单独计算)并在转换后将其恢复为单列。

下面是两种方法的代码:

# 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

关于python-3.x - 如何使用包含 numpy.ndarrays 的列/列对 pandas 数据框执行 StandardScaler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com