比方說,我有一個熊貓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
結果的解釋? - 爲什麼
Series
和DataFrame
在這個問題上的不一致?
一致同意。要回答你的第一個問題,我所要做的就是使用我認爲很自然的語法。你會認爲一組特定的索引號會像事物一樣不可變,而一個「元組」會有意義。世界末日我不能使用'元組',我也不會特別掛斷這件事。最後,不能做到這一點並不會讓我感到挫折,而是觸發我的好奇心。 –
很棒的回答。我會爭辯說,雖然'.ix [(3,7)]'返回'3'是一個錯誤。我無法想象,這可能是怎樣的預期行爲,我認爲這是一個例子,說明在Pandas中某些時候處理不好的意外投入。 – JoeCondron
@JoeCondron是的,好點!完全同意你的意見。 – JohnE