2014-09-30 61 views
2

考慮大熊貓數據幀不一致的行爲

df = DataFrame({'somedata': [13,24,54]}, index=[1,1,2]) 

    somedata 
1 13 
1 24 
2 54 

執行

df.ix[1, 'somedata'] 

將返回一個對象

1 13 
1 24 
Name: somedata, dtype: int64 

其具有索引:

df.ix[1, 'somedata'].index 
Int64Index([1, 1], dtype='int64') 

但是,在執行

df.ix[2, 'somedata'] 

將返回只是排名第54位,其中有沒有索引:

df.ix[2, 'somedata'].index 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-274-3c6e4b1e6441> in <module>() 
----> 1 df.ix[2, 'somedata'].index 

AttributeError: 'numpy.int64' object has no attribute 'index' 

我不明白這一點(貌似?)不一致的行爲。這是故意的嗎?我希望從同一個操作返回的對象具有相同的結構。此外,我需要圍繞這個問題構建我的代碼,所以我的問題是,如何檢測ix選擇返回哪種對象?目前我正在檢查返回的對象的len。我不知道是否有一個更優雅的方式,或者如果可以強制,而不是隻返回54號的選擇,返回類似的形式

2 54 
Name: somedata, dtype: int64 

很抱歉,如果這是一個愚蠢的問題,我無法找到這是任何地方的答案。

回答

4

如果您傳遞索引列表而不是單個索引,則可以保證您將獲得一個Series。換句話說,而不是

>>> df.loc[1, 'somedata'] 
1 13 
1 24 
Name: somedata, dtype: int64 
>>> df.loc[2, 'somedata'] 
54 

你可以使用

>>> df.loc[[1], 'somedata'] 
1 13 
1 24 
Name: somedata, dtype: int64 
>>> df.loc[[2], 'somedata'] 
2 54 
Name: somedata, dtype: int64 

(請注意,它通常是一個好主意,用loc(或iloc),而不是ix,因爲它不太神奇,雖然這ISN」這是什麼原因導致你的問題在這裏。)

+0

你可能想擴大的原因你得到一個與1和2的標量系列;喵,因爲索引有重複 – Jeff 2014-09-30 22:01:46