Python pandas。为什么df.iloc[:, :-1].values对我的训练数据只选择到最后第二列?

15 人关注

Very simply put,

对于同一个训练数据框 df ,当我使用 替换代码1】时,它会选择到数据框的倒数第二列,而不是最后一列(这是我想要的,但这是我以前从未见过的奇怪行为),我知道这是因为倒数第二列的值和该行的最后一列的值不同。

然而,使用 替换代码2】可以得到最后一列数值的行向量,这正是我想要的。

为什么X的负1给我的是倒数第二列的值?

5 个评论
直到最后一列,但不包括最后一列,因为Python范围/切片不包括终点...... 我不明白你在期待什么......
比如, data = [1,2,3,4,5] ,那么直到最后一个元素 data[:-1] -> [1,2,3,4] 的片断将删除最后一个元素,因为终点是最后一个元素,而片断从不包括终点。这正是我们所期望的行为。
df.iloc[:, 2] 选择第二列,但 df.iloc[:, :2] 或明确的 df.iloc[:, 0:2] 选择直到(不包括)第二列的列。这和Python的分片是一样的。当你使用一个负的索引时,没有任何变化。如果你说 df.iloc[:, -1] ,它意味着最后一列,但是 df.iloc[:, :-1] 意味着直到最后一列。
哦,是的,我明白了......我把-1误解为总是选择最后一列。
@leeks50996 -1 indice does 总是意味着 "最后一个元素",但在切片中,端点被排除在外。 例如,这与正指数的行为相同。 data = "abcde" 的索引 2 指的是 "c" ,而 data[:2] 将是所有到 c 的内容,但不包括 data[:2] -> "ab"
python
pandas
kwotsin
kwotsin
发布于 2016-05-30
4 个回答
jezrael
jezrael
发布于 2022-05-01
已采纳
0 人赞同

我认为你在 df 中只有两列,因为如果有更多的列。 iloc 选择所有列,没有最后一个。

df = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6],
                   'C':[7,8,9],
                   'D':[1,3,5],
                   'E':[5,3,6],
                   'F':[7,4,3]})
print (df)
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3
print(df.iloc[:, :-1])
   A  B  C  D  E
0  1  4  7  1  5
1  2  5  8  3  3
2  3  6  9  5  6
X = df.iloc[:, :-1].values
print (X)
[[1 4 7 1 5]
 [2 5 8 3 3]
 [3 6 9 5 6]]
print (X.shape)
(3, 5)
    
这很奇怪,因为我的df原本有24列,显示在df.shape中(打印在截图中)。
而什么回报 print df.columns
它给了我一个[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]的数组,因为我在读取df的时候,header = None
嗯,但是截图返回 X.shape = (670294, 23) ,这意味着所有列都没有最后一个。
嗯,是的,我刚刚意识到-1并不总是意味着 "最后一列";在切片的背景下,它实际上意味着 "直到最后一列之前"。
piRSquared
piRSquared
发布于 2022-05-01
0 人赞同

只是为了清晰起见

关于python的语法,这个问题在这里已经有了答案。

Python的列表分片语法规定,对于 a:b ,它将得到 a 和所有直到但不包括 b 的东西。 替换代码3】将获得 a 和它之后的所有内容。 :b 将获得 b 之前的所有内容,但不包括 b -1 的列表索引指的是最后一个元素。 :-1 遵守与上述相同的标准,即获得最后一个元素之前的所有内容,而不是最后一个元素。 如果你想包括最后一个元素,请使用 :

Manoj Kumar
Manoj Kumar
发布于 2022-05-01
0 人赞同

Bcz 上限是排他性的。它类似于对一个列表的切片。

a=[1,2,3,4]
a[:3]

将导致[1, 2, 3]。它没有取最后一个元素。

Shafin Junayed
Shafin Junayed
发布于 2022-05-01
0 人赞同

以防你从中学到什么

# Single selections using iloc and DataFrame
# Rows:
data.iloc[0] # first row of data frame (Aleshia Tomkiewicz) - Note a Series data type output.
data.iloc[1] # second row of data frame (Evan Zigomalas)
data.iloc[-1] # last row of data frame (Mi Richan)