簡體   English   中英

與典型的python切片相反,為什么.loc在pandas中切片包含stop?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM