在 train_test_split 返回的数据上,熊猫“不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []”

Posted

技术标签:

【中文标题】在 train_test_split 返回的数据上,熊猫“不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []”【英文标题】:Pandas 'Passing list-likes to .loc or [] with any missing labels is no longer supported' on train_test_split returned data 【发布时间】:2020-06-13 00:00:20 【问题描述】:

由于某种原因,train_test_split 尽管长度相同且索引看起来相同,但仍会触发此错误。

from sklearn.model_selection import KFold

data = 'col1':[30.5,45,1,99,6,5,4,2,5,7,7,3], 'col2':[99.5, 98, 95, 90,1,5,6,7,4,4,3,3],'col3':[23, 23.6, 3, 90,1,9,60,9,7,2,2,1] 
df = pd.DataFrame(data)

train, test = train_test_split(df, test_size=0.10)
X = train[['col1', 'col2']]
y2 = train['col3']

X = np.array(X)

kf = KFold(n_splits=3, shuffle=True)
for train_index, test_index in kf.split(X):
    X_train, y_train = X[train_index], y[train_index]

y 是熊猫系列(与 x 长度相同)。 x 是一个数据框,大约有 20 个数字列转换为 numpy 数组。

由于某种原因,train_test_split 会触发错误,尽管长度相同。

如果我不调用 train_test_split 它可以正常工作。

由于尝试以这种方式索引 numpy 数组而触发错误的最后一行: y[train_ind]

【问题讨论】:

您的问题包括缺少参数,例如什么是 r?是吗?折叠?请参阅最小可重现示例***.com/help/minimal-reproducible-example 你可以试试xtrain,ytrain = x[train_ind],y[train_ind] 产生同样的错误和 x[train_ind:],y[train_ind] 给出:只有整数标量数组可以转换为标量索引 告诉我们x - 形状,dtype?还有train_ind 【参考方案1】:

我已尝试为您的情况创建一个场景。

我创建了以下数据框:

    col1  col2  col3
0      1     2     1
1      3     4     0
2      5     6     1
3      7     8     0
4      9    10     1
5     11    12     0
6     13    14     1
7     15    16     0
8     17    18     1
9     19    20     0
10    21    22     1
11    23    24     0
12    25    26     1
13    27    28     0
14    29    30     1

我为 X 设置了 col1col2,为 y 设置了 col3。在此之后,我将 X 转换为 numpy 数组,如下所示。唯一不同的是我在KFold 中使用了shuffle

X = df[['col1', 'col2']]
y = df['col3']
X = np.array(X)
kf = KFold(n_splits=3, shuffle=True)
for train_index, test_index in kf.split(X):
    X_train, y_train = X[train_index], y[train_index]

而且效果很好。所以请检查我的代码和你的代码,如果我遗漏了什么,请澄清一下。

更新

我假设 y2 是 y。所以y类型仍然是Series,你需要使用.iloc。以下代码运行良好。

data = 'col1':[30.5,45,1,99,6,5,4,2,5,7,7,3], 'col2':[99.5, 98, 95, 90,1,5,6,7,4,4,3,3],'col3':[23, 23.6, 3, 90,1,9,60,9,7,2,2,1]
df = pd.DataFrame(data)
train, test = train_test_split(df, test_size=0.10)

X = train[['col1', 'col2']]
y = train['col3']

X = np.array(X)

kf = KFold(n_splits=3, shuffle=True)
for train_index, test_index in kf.split(X):
    X_train, y_train = X[train_index], y.iloc[train_index]

【讨论】:

你是对的。它与 sci kit 中的 train_test_split 函数有关。由于某种原因,返回的数据类型看起来完全相同,但会产生错误。我会更新问题。【参考方案2】:

如果这对任何人都有帮助,我在数据帧上使用 .groupby 函数时遇到了同样的问题。我通过使用修复它:

df.reset_index(drop=True, inplace=True)

【讨论】:

以上是关于在 train_test_split 返回的数据上,熊猫“不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []”的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 make_csv_dataset 创建的数据集上制作 train_test_split

大熊猫上的sklearn train_test_split 按多列分层

一旦尝试适合预处理,train_test_split 训练数据上的“IndexError:元组索引超出范围”

为什么在train_test_split的两个数组中都包含目标类?

在 train_test_split sklearn python 上设置种子

关于train_test_split函数是不是打乱数据的验证