[英]Why is .loc slicing in pandas inclusive of stop, contrary to typical python slicing?
我正在切換一個pandas數據幀,我似乎正在使用.loc
獲得意外的切片,至少與numpy和普通的python切片相比。 請參閱下面的示例。
>>> import pandas as pd
>>> a = pd.DataFrame([[0,1,2],[3,4,5],[4,5,6],[9,10,11],[34,2,1]])
>>> a
0 1 2
0 0 1 2
1 3 4 5
2 4 5 6
3 9 10 11
4 34 2 1
>>> a.loc[1:3, :]
0 1 2
1 3 4 5
2 4 5 6
3 9 10 11
>>> a.values[1:3, :]
array([[3, 4, 5],
[4, 5, 6]])
有趣的是,這只發生在.loc
,而不是.iloc
。
>>> a.iloc[1:3, :]
0 1 2
1 3 4 5
2 4 5 6
因此, .loc
似乎包含終止索引,但numpy和.iloc
不是。
通過評論,似乎這不是一個錯誤,我們得到了很好的警告。 但為什么會這樣呢?
請記住.loc
主要是基於標簽的索引。 使用非RangeIndex時,包含停止端點的決定變得更加明顯:
df = pd.DataFrame([1,2,3,4], index=list('achz'))
# 0
#a 1
#c 2
#h 3
#z 4
如果我想選擇'a'
和'h'
(包括)之間'a'
所有行,我只知道'a'
和'h'
。 為了與其他python切片保持一致,你還需要知道跟隨'h'
索引,在這種情況下是'z'
但可能是任何東西。
還隱藏了一部分文檔,解釋了這個設計選擇端點是包含的
除了文檔中的要點之外,使用.loc
pandas
slice索引不是基於單元索引的。 它實際上是基於價值的索引 (在pandas文檔中它被稱為“基於標簽”,但對於數字數據,我更喜歡術語“基於值”),而對於.iloc
它是傳統的numpy風格的單元索引。
此外,基於價值的索引是包容性的,而細胞索引則不是。 試試以下內容:
a = pd.DataFrame([[0,1,2],[3,4,5],[4,5,6],[9,10,11],[34,2,1]])
a.index = [0, 1, 2, 3.1, 4] # add a float index
# value based slicing: the following will output all value up to the slice value
a.loc[1:3.1]
# Out:
# 0 1 2
# 1.0 3 4 5
# 2.0 4 5 6
# 3.1 9 10 11
# index based slicing: will raise an error, since only integers are allowed
a.iloc[1:3.1]
# Out: TypeError: cannot do slice indexing on <class 'pandas.core.indexes.numeric.Float64Index'> with these indexers [3.2] of <class 'float'>
要明確回答您的問題,為什么它是正確的:
當使用值/標簽作為索引時,至少在我看來,直觀的是,包含最后一個索引。 據我所知,這是一個關於實現函數如何工作的設計決策。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.