我有一个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做到这一点,只是好奇为什么切片在一个列表中起作用而在另一个列表中却没有。
谢谢。
答案 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时,需要某种默认行为,不幸的是,它取决于索引,从而使其在各种索引数据类型之间感觉不稳定。幸运的是,通过使用loc
和iloc
,您可以避免所有这些混乱。