@@ -1590,6 +1590,38 @@ def test_unstack_group_index_overflow(self):
1590
1590
result = s .unstack (4 )
1591
1591
assert result .shape == (500 , 2 )
1592
1592
1593
+ def test_pyint_engine (self ):
1594
+ # GH 18519 : when combinations of codes cannot be represented in 64
1595
+ # bits, the index underlying the MultiIndex engine works with Python
1596
+ # integers, rather than uint64.
1597
+ N = 5
1598
+ keys = [tuple (l ) for l in [[0 ] * 10 * N ,
1599
+ [1 ] * 10 * N ,
1600
+ [2 ] * 10 * N ,
1601
+ [np .nan ] * N + [2 ] * 9 * N ,
1602
+ [0 ] * N + [2 ] * 9 * N ,
1603
+ [np .nan ] * N + [2 ] * 8 * N + [0 ] * N ]]
1604
+ # Each level contains 4 elements (including NaN), so it is represented
1605
+ # in 2 bits, for a total of 2*N*10 = 100 > 64 bits. If we were using a
1606
+ # 64 bit engine and truncating the first levels, the fourth and fifth
1607
+ # keys would collide; if truncating the last levels, the fifth and
1608
+ # sixth; if rotating bits rather than shifting, the third and fifth.
1609
+
1610
+ for idx in range (len (keys )):
1611
+ index = MultiIndex .from_tuples (keys )
1612
+ assert index .get_loc (keys [idx ]) == idx
1613
+
1614
+ expected = np .arange (idx + 1 , dtype = 'int64' )
1615
+ result = index .get_indexer ([keys [i ] for i in expected ])
1616
+ tm .assert_numpy_array_equal (result , expected )
1617
+
1618
+ # With missing key:
1619
+ idces = range (len (keys ))
1620
+ expected = np .array ([- 1 ] + list (idces ), dtype = 'int64' )
1621
+ missing = tuple ([0 , 1 ] * 5 * N )
1622
+ result = index .get_indexer ([missing ] + [keys [i ] for i in idces ])
1623
+ tm .assert_numpy_array_equal (result , expected )
1624
+
1593
1625
def test_getitem_lowerdim_corner (self ):
1594
1626
pytest .raises (KeyError , self .frame .loc .__getitem__ ,
1595
1627
(('bar' , 'three' ), 'B' ))
0 commit comments