簡體   English   中英

熊貓中奇怪的索引行為

[英]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 )。 12匹配,並且每次匹配時都會獲得匹配值(並且每次匹配都會獲得多個值)。

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.

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