2016-03-24 36 views
2

比方說,我有一個熊貓Series,我想在特定的索引來訪問一組元素,像這樣:熊貓索引方法和元組作爲參數

In [1]: 
from pandas import Series 
import numpy as np 

s = Series(np.arange(0,10)) 

In [2]: s.loc[[3,7]] 

Out[2]: 
3 3 
7 7 
dtype: int64 

.loc方法接受list作爲參數對於這種選擇。方法.iloc.ix的工作方式相同。

但是,如果我用一個tuple的參數,既.loc.iloc失敗:

In [5]: s.loc[(3,7)] 
--------------------------------------------------------------------------- 
IndexingError        Traceback (most recent call last) 
........ 
IndexingError: Too many indexers 

In [6]: s.iloc[(3,7)] 
--------------------------------------------------------------------------- 
IndexingError        Traceback (most recent call last) 
........ 

IndexingError: Too many indexers 

而且.ix產生一個奇怪的結果:

In [7]: s.ix[(3,7)] 
Out[7]: 3 

現在,我得到,你可以」 t甚至用原料python做這個list

In [27]: 
x = list(range(0,10)) 
x[(3,7)] 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-27-cefdde088328> in <module>() 
     1 x = list(range(0,10)) 
----> 2 x[(3,7)] 

TypeError: list indices must be integers or slices, not tuple 

要從list中檢索一組特定索引,您需要使用理解as explained here

但另一方面,使用tuple來從熊貓DataFrame中選擇行似乎對所有三種索引方法都正常工作。下面是一個例子與.loc方法:

In [8]: 
from pandas import DataFrame 
df = DataFrame({"x" : np.arange(0,10)}) 

In [9]: 
df.loc[(3,7),"x"] 

Out[9]: 
3 3 
7 7 
Name: x, dtype: int64 

我的三個問題是:

  • 爲什麼不Series索引接受tuple?看起來
    自然使用tuple,因爲所需索引的集合是不可變的一次性參數
    。這僅僅是爲了模仿list接口的 的目的嗎?
  • 什麼是奇怪Series.ix結果的解釋?
  • 爲什麼SeriesDataFrame在這個問題上的不一致?

回答

2

我認爲第一個問題的答案是tuples用於找到MultiIndex。我認爲除了你在代碼中分別暴露了一個錯誤和一個不一致性之外,對於後面兩個問題沒有好的答案(這不難做:))。 所以Series抱怨,因爲你沒有 MultiIndex或更一般地說,元組的長度大於索引中的層數。 DataFrame應該可能以相同的方式作出反應,但不會。 我認爲最安全的做法是爲MultiIndex保留tuples並使用列表/數組/序列來索引多行。 作爲一個附註,您將使用元組的列表/數組來選擇MultiIndex中的多個行。

2

很難系統地回答這個問題,所以我就回答列表樣式:

  1. 我認爲更大的問題可能是,究竟是你想這樣做,但不能?即你爲什麼要用()而不是[][]是標準的方式?
  2. 你的第一個問題實際上只是爲什麼句法是某種方式,而這幾乎是一個不可能回答的問題,而不會深入到熊貓的歷史中,而是深入到numpy的歷史中。無論如何,@ JoeCondron的簡單答案是正確的:元組用於多索引,列表用於高級索引(又名「花式索引」)。我相信花式索引直接從numpy中解放出來,並且多個索引被熊貓添加。
  3. 對於你的最後一個問題,我猜這是不一致的,但是Series和DataFrames不是完全相同的東西,所以它們的行爲不可能100%一致。特別是,DataFrame索引需要額外的機器來區分行和列,而一個Series只需要擔心行。
  4. 要從一般意義上回答您的問題,我認爲您在這裏展示的是當您使用非標準語法時可能仍然按照您的要求工作,但它可能不會。所以我不認爲這是公平的,df.loc在這裏工作和s.loc沒有。這兩個都沒有保證在這裏工作(根據文件),但發生了df.loc。此外,很有可能df.loc將在未來的版本中停止工作。
  5. 如果您發現loc/iloc/ix的示例不能按照文檔所示的方式工作,那麼應該指出並報告爲錯誤。我不相信任何上述內容屬於這一類,但我肯定可能是錯的。
+0

一致同意。要回答你的第一個問題,我所要做的就是使用我認爲很自然的語法。你會認爲一組特定的索引號會像事物一樣不可變,而一個「元組」會有意義。世界末日我不能使用'元組',我也不會特別掛斷這件事。最後,不能做到這一點並不會讓我感到挫折,而是觸發我的好奇心。 –

+0

很棒的回答。我會爭辯說,雖然'.ix [(3,7)]'返回'3'是一個錯誤。我無法想象,這可能是怎樣的預期行爲,我認爲這是一個例子,說明在Pandas中某些時候處理不好的意外投入。 – JoeCondron

+0

@JoeCondron是的,好點!完全同意你的意見。 – JohnE