[英]Strange indexing behavior in Pandas
我正在考慮一個最近的項目中的一個潛在問題,該問題可能是由於pandas
索引不唯一而引起的,所以我開始嘗試一些場景,看看會發生什么。 這樣做時,我偶然發現了以下奇怪行為:
In [1]: import pandas as pd
In [2]: pd.version.version
Out[2]: '0.12.0'
In [3]: df1 = pd.DataFrame(range(10), index=[1, 2]*5)
In [4]: df2 = pd.DataFrame(range(10), index=range(5)*2)
In [5]: df1
Out[5]:
0
1 0
2 1
1 2
2 3
1 4
2 5
1 6
2 7
1 8
2 9
In [6]: df2
Out[6]:
0
0 0
1 1
2 2
3 3
4 4
0 5
1 6
2 7
3 8
4 9
如果我將df2
的索引傳遞給df1
的索引器,則會得到一些意外的結果(如箭頭所示)
In [7]: df1.ix[df2.index]
Out[7]:
0
0 NaN
1 2.000000e+00
1 4.000000e+00
1 6.000000e+00
1 8.000000e+00
1 1.000000e+00 <---
2 3.000000e+00
2 5.000000e+00
2 7.000000e+00
2 9.000000e+00
2 0.000000e+00 <---
3 NaN
4 NaN
0 NaN
1 8.000000e+00
1 1.000000e+00 <---
1 3.000000e+00 <---
1 5.000000e+00 <---
1 7.000000e+00 <---
2 9.000000e+00
2 3.636673e+17 <---
2 4.020594e+17 <---
2 3.628229e+17 <---
2 2.171412e+18 <---
3 NaN
4 NaN
不僅存在不在兩個DataFrame
中的值,而且與每個索引關聯的某些值是錯誤/意外的; 與1
關聯的值應為DataFrame.ix
和8,與2
關聯的值應為1、3、5、7和9。我認為這可能與DataFrame.ix
接受有關位置索引或標簽,但DataFrame.loc
發生相同的情況
In [10]: df1.loc[df2.index]
Out[10]:
0
0 NaN
1 2.000000e+00
1 4.000000e+00
1 6.000000e+00
1 8.000000e+00
1 1.000000e+00
2 3.000000e+00
2 5.000000e+00
2 7.000000e+00
2 9.000000e+00
2 0.000000e+00
3 NaN
4 NaN
0 NaN
1 8.000000e+00
1 1.000000e+00
1 3.000000e+00
1 5.000000e+00
1 7.000000e+00
2 9.000000e+00
2 3.625411e+17
2 3.996824e+17
2 4.009981e+17
2 3.636670e+17
3 NaN
4 NaN
我已多次重新運行此方案,並且意外值始終出現在同一位置,但可能是不同的值。 為什么會發生這種情況,為什么不引發異常呢? 我在文檔中找不到解釋,這種情況在工作的32位Windows系統和家庭的64位Linux系統上都會發生。 我正在使用numpy 1.8.0
,順便說一句。
重復索引的重復索引在0.12中有些破損。 這是0.13的結果。 您的結果是某些內部例程訪問未初始化的內存的結果(因此,每次運行所返回的“值”可能不一致,因此是一個錯誤)。
您必須真正考慮要熊貓做的事情。
您說的是根據您提供的df2.index
值進行查找,然后在df1
的索引中找到它們。
值0,3,4
不在df1的索引中,因此將它們標記為nan
(並且由於兩次指定了該值,因此每個兩次都獲得nan
)。 值1
和2
匹配,並且每次匹配時都會獲得匹配值(並且每次匹配都會獲得多個值)。
In [13]: df1.ix[df2.index]
Out[13]:
0
0 NaN
1 0
1 2
1 4
1 6
1 8
2 1
2 3
2 5
2 7
2 9
3 NaN
4 NaN
0 NaN
1 0
1 2
1 4
1 6
1 8
2 1
2 3
2 5
2 7
2 9
3 NaN
4 NaN
[26 rows x 1 columns]
您可能正在尋找位置索引。 您提供的值在哪里是結果的locations
(並且不在乎標簽)。 這適用於0.12和0.13 FYI。
In [14]: df1.iloc[df2.index]
Out[14]:
0
1 0
2 1
1 2
2 3
1 4
1 0
2 1
1 2
2 3
1 4
[10 rows x 1 columns]
重復重復索引非常棘手。 如果您有一個提供某些屬性的替代解決方案(例如,索引器的順序必須保留在輸出中,並且您需要保證所有重復項都匹配),則不妨聽聽一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.