困惑与熊猫系列切片

时间:2020-10-12 21:56:19

标签: python pandas slice

我有一个Pandas DataFrame,其中一栏是出租车的行驶距离。我正在使用 $ npm run perf > immutable@4.0.0-rc.12 perf /Users/mcc/work/h/tempt2/fork/immutable-js > node ./resources/bench.js ugh Error: Command failed: git show master:dist/immutable.js fatal: Path 'dist/immutable.js' exists on disk, but not in 'master'. at ChildProcess.exithandler (child_process.js:308:12) at ChildProcess.emit (events.js:314:20) at maybeClose (internal/child_process.js:1047:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:287:5) 在此列上,以查看最常见的行程距离。

value_counts()

对象b是熊猫系列对象。为了完整起见,本系列的前5行是

b = df['trip_distance'].value_counts()

这意味着最常见的行程距离是1,它出现21815次,其余的都相同。

但是,如果我键入1.00 21815 0.90 18915 0.80 18449 1.10 18263 1.20 17823 而不是打印本系列的前四个元素,它将找到与b[0:4]行程距离相对应的元素,并开始打印所有行程距离,直到达到行程距离4。当然,如果行程4早于距离0,它将返回一个空系列。

尽管如此,当我在自定义系列上尝试

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]

有人知道为什么会这样吗? 我知道可以使用iloc / loc做到这一点,只是好奇为什么切片在一个列表中起作用而在另一个列表中却没有。

谢谢。

1 个答案:

答案 0 :(得分:2)

在索引来自系列(或数据框的行)的值时,我始终建议您使用.loc.iloc索引访问器。本质上,通过使用这些访问器,您可以明确地告诉熊猫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]

我们是否要让熊猫在索引中找到11到13的值存在并将其切成薄片?还是我们要求本系列的第12和13个元素?在这种情况下,大熊猫使用了后者(见下文)。但是,我建议您始终使用loc.iloc分割为Series或DataFrame,以避免这种歧义。

data[11:13]
Series([], dtype: int64)

那只是用于切片基于整数的索引。您的问题来自熊猫如何实现浮动类型索引(这是真正的思想绕线者):

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

那有什么用呢?本质上,必须做出决定。切片为Series时,需要某种默认行为,不幸的是,它取决于索引,从而使其在各种索引数据类型之间感觉不稳定。幸运的是,通过使用lociloc,您可以避免所有这些混乱。