在 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 设置了 col1
和 col2
,为 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的两个数组中都包含目标类?