gpt4 book ai didi

python - 与 Pandas 系列切片的混淆

转载 作者:行者123 更新时间:2023-12-04 08:45:57 26 4
gpt4 key购买 nike

我有一个 Pandas DataFrame,其中一列是出租车所覆盖的行程距离。我正在使用value_counts()在此列上查看最常见的行程距离。b = df['trip_distance'].value_counts()对象 b 是一个 Pandas 系列对象。为了完成起见,本系列的前 5 行是

1.00     21815
0.90 18915
0.80 18449
1.10 18263
1.20 17823
这意味着最常见的行程距离是 1,它出现了 21815 次,其余的都一样。
但是,如果我输入 b[0:4]它没有打印此系列的前 4 个元素,而是查找对应于 0 的元素。行程距离,并开始打印所有行程距离,直到达到行程距离 4。当然,如果行程距离 4 在行程距离 0 之前,则返回一个空系列。
尽管如此,当我在自定义系列上尝试时 a = pd.Series([3, 1, 2, 3, 4, 4, 5]).value_counts()打印 a
 4    2
3 2
5 1
2 1
1 1
当我尝试对这个系列进行切片时,即当我输入 a[0, 3] 时我得到了预期
4    2
3 2
5 1
有谁知道为什么会这样?
我知道这可以用 iloc/loc 来完成,我只是好奇为什么切片在一个列表中起作用,而在另一个列表中不起作用。
提前致谢。

最佳答案

当索引来自系列(或来自数据帧的行)的值时,我将始终建议您使用 .loc.iloc索引访问器。本质上,通过使用这些访问器,您明确地告诉 Pandas loc :“此切片将基于索引的顺序”或iloc :“此切片将基于值的排序”。当您不使用 loc/iloc(例如您的案例)并且有数字索引时,棘手的部分就出现了。当您不使用它们时,pandas 会尝试推断您指的是索引顺序还是值的顺序。本质上,如果您使用一系列数字进行切片,pandas 会假设您正在尝试使用值的位置 - 忽略索引。

import pandas as pd

data = pd.Series([5,6,7,8,9], index=range(10, 15))
print(data)

10 5
11 6
12 7
13 8
14 9
dtype: int64
使用 .loc从索引中获取对应于切片“a”到“c”的值:
# Slice based on the index values 11 to 13
data.loc[11:13]
11 6
12 7
13 8
dtype: int64
但是,如果我们想要基于它们在系列中的位置的值,我们使用 iloc .您还会注意到 iloc生成不包含最终值的切片(例如,我们只返回元素 1 和 2,并在下面的示例中省略 3)。而在上面使用 loc 的示例中,我们返回了对应于索引中 11、12 和 13 的元素。
data.iloc[1:3]
11 6
12 7
dtype: int64
既然已经说了,我希望你明白为什么这意味着什么非常不清楚:
data[11:13]
我们是否要求 Pandas 在索引中找到值 11 到 13 的位置并给我们那个切片?或者我们要求这个系列的第 12 和第 13 元素?在这种情况下,pandas 使用了后者(见下文)。但是,我鼓励您始终使用 loc 切片成系列或数据帧。或 .iloc为了避免这种歧义。
data[11:13]
Series([], dtype: int64)
这仅用于对基于整数的索引进行切片。您的问题来自 Pandas 如何实现 float 类型索引(这是真正的头脑 Storm ):
data.index = data.index.astype("float")
print(data)
10.0 5
11.0 6
12.0 7
13.0 8
14.0 9
dtype: int64
现在突然之间,您可以执行此操作并返回值,就像您使用 .loc 一样。 :
data[11:13]
11.0 6
12.0 7
13.0 8
dtype: int64
那么什么给呢?本质上,必须做出决定。需要有某种类型的默认行为来切片成系列,不幸的是它取决于索引,这使得它在索引数据类型之间变得不稳定。幸运的是,您可以使用 loc 避免所有这些混淆。和 iloc .

关于python - 与 Pandas 系列切片的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64325834/

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