python - iloc 方法返回不同类型的数据
问题描述
我有一个 30 obs 和 2 列的数据集,我使用下面的代码为单个线性回归创建独立和依赖的数据集。
所以每个数据集都应该是一个 1 列的数组。
但是返回 X 是一个二维数组,返回的 y 是一个一维数组,这是什么原因?
所以把我的问题放在一行中:
有什么区别
X = dataset.iloc[:, 0].values
和
X = dataset.iloc[:, :-1].values?
当我使用:
X = dataset.iloc[:, 0].values
y = dataset.iloc[:, 1].values
X.shape
Out[207]: (30,)
y.shape
Out[204]: (30,)
当我使用:
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 1].values
X.shape
Out[203]: (30, 1)
y.shape
Out[204]: (30,)
解决方案
:-1
表示范围1,而-1
是标量。范围是一维的,而标量是零维的。想想一条线与一个点;范围是一条线,而标量是一个点。这反映在 Pandas 在索引时如何转换范围与标量。
因此,以下内容对于具有 2 列的数据框是等效的:
df = pd.DataFrame(np.random.random((5, 2)))
df.iloc[:, :-1].shape # (5, 1)
df.iloc[:, [0]].shape # (5, 1)
使用标量将删除额外的维度。您可以通过以下几种方式执行此操作:
df.iloc[:, 0].shape # (5,)
df.iloc[:, -2].shape # (5,)
实际上,:-1
是slice
对象的语法糖:slice(0, -1)
. 实际上,除非您需要传递slice
对象,否则首选更简单的语法。
推荐阅读
- android - 如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或活动缩放
- apache-spark - Spark-Streaming 记录比较
- vba - 粘贴空白图片(位图)仅适用于 1 张幻灯片,使用 VBA 将数据从 Excel 粘贴到电源点时仍按预期工作
- java - 运行时 JsonString 到 JavaObject
- visual-studio - 如何使用 ReSharper 找到所有未使用的 using 语句?
- sql-server - Visual Studio Code SQL Server 连接到使用 Azure Key Vault 的加密数据库(始终加密)
- css - material-ui-next:设置图像大小以适合容器
- python - 使用 Python 将图像填充到一个大小
- wpf - 在 WPF 中绑定 ListBox SelectedItem
- ruby-on-rails - 如何在更改数据库时修复 Sequel::DatabaseConnectionError