Skip to content

Commit a5801f6

Browse files
committed
API: enable float slicing with .loc on int index
1 parent dd1ff3e commit a5801f6

File tree

3 files changed

+64
-43
lines changed

3 files changed

+64
-43
lines changed

pandas/core/index.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2134,7 +2134,7 @@ def _maybe_cast_slice_bound(self, label, side):
21342134
# pass thru float indexers if we have a numeric type index
21352135
# which then can decide to process / or convert and warng
21362136
if is_float(label):
2137-
if not self.is_floating():
2137+
if not (self.is_integer() or self.is_floating()):
21382138
self._invalid_indexer('slice',label)
21392139

21402140
# we are not an integer based index, and we have an integer label

pandas/tests/test_index.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -969,11 +969,11 @@ def test_slice_locs(self):
969969

970970
# int slicing with floats
971971
idx = Index(np.array([0, 1, 2, 5, 6, 7, 9, 10], dtype=int))
972-
self.assertRaises(TypeError, lambda : idx.slice_locs(5.0, 10.0))
973-
self.assertRaises(TypeError, lambda : idx.slice_locs(4.5, 10.5))
972+
self.assertEqual(idx.slice_locs(5.0, 10.0), (3, n))
973+
self.assertEqual(idx.slice_locs(4.5, 10.5), (3, 8))
974974
idx2 = idx[::-1]
975-
self.assertRaises(TypeError, lambda : idx2.slice_locs(8.5, 1.5))
976-
self.assertRaises(TypeError, lambda : idx2.slice_locs(10.5, -1))
975+
self.assertEqual(idx2.slice_locs(8.5, 1.5), (2, 6))
976+
self.assertEqual(idx2.slice_locs(10.5, -1), (0, n))
977977

978978
def test_slice_locs_dup(self):
979979
idx = Index(['a', 'a', 'b', 'c', 'd', 'd'])

pandas/tests/test_indexing.py

+59-38
Original file line numberDiff line numberDiff line change
@@ -709,10 +709,6 @@ def compare(result, expected):
709709
compare(df2, df1)
710710

711711
# edge cases
712-
s = Series(['a','b','c','d'], [1,2,3,4])
713-
self.assertRaises(TypeError, lambda : s.ix[1.5:5.5])
714-
self.assertRaises(TypeError, lambda : s.loc[1.5:5.5])
715-
716712
s = Series([1,2,3,4], index=list('abde'))
717713

718714
result1 = s['a':'c']
@@ -4047,7 +4043,7 @@ def check_slicing_positional(index):
40474043

40484044
# int
40494045
index = tm.makeIntIndex()
4050-
s = Series(np.arange(len(index))+10,index)
4046+
s = Series(np.arange(len(index))+10,index+5)
40514047

40524048
# this is positional
40534049
result1 = s[2:5]
@@ -4059,55 +4055,80 @@ def check_slicing_positional(index):
40594055
result3 = s.loc[2:5]
40604056
assert_series_equal(result2, result3)
40614057

4062-
# make all float slicing fail
4063-
self.assertRaises(TypeError, lambda : s.loc[2.0:5])
4064-
self.assertRaises(TypeError, lambda : s.loc[2.0:5.0])
4065-
self.assertRaises(TypeError, lambda : s.loc[2:5.0])
4066-
self.assertRaises(TypeError, lambda : s[2.0:5])
4067-
self.assertRaises(TypeError, lambda : s[2.0:5.0])
4068-
self.assertRaises(TypeError, lambda : s[2:5.0])
4058+
# float slicers on an int index
4059+
expected = Series([11,12,13],index=[6,7,8])
4060+
result = s.loc[6.0:8.5]
4061+
assert_series_equal(result, expected)
4062+
4063+
result = s.loc[5.5:8.5]
4064+
assert_series_equal(result, expected)
4065+
4066+
result = s.loc[5.5:8.0]
4067+
assert_series_equal(result, expected)
40694068

4070-
self.assertRaises(TypeError, lambda : s.ix[2.0:5])
4071-
self.assertRaises(TypeError, lambda : s.ix[2.0:5.0])
4072-
self.assertRaises(TypeError, lambda : s.ix[2:5.0])
4069+
# make all float slicing fail for ix/[] with an int index
4070+
self.assertRaises(TypeError, lambda : s[6.0:8])
4071+
self.assertRaises(TypeError, lambda : s[6.0:8.0])
4072+
self.assertRaises(TypeError, lambda : s[6:8.0])
4073+
self.assertRaises(TypeError, lambda : s.ix[6.0:8])
4074+
self.assertRaises(TypeError, lambda : s.ix[6.0:8.0])
4075+
self.assertRaises(TypeError, lambda : s.ix[6:8.0])
40734076

40744077
# these work for now
4075-
#self.assertRaises(TypeError, lambda : s.iloc[2.0:5])
4076-
#self.assertRaises(TypeError, lambda : s.iloc[2.0:5.0])
4077-
#self.assertRaises(TypeError, lambda : s.iloc[2:5.0])
4078+
#self.assertRaises(TypeError, lambda : s.iloc[6.0:8])
4079+
#self.assertRaises(TypeError, lambda : s.iloc[6.0:8.0])
4080+
#self.assertRaises(TypeError, lambda : s.iloc[6:8.0])
40784081

40794082
# float
40804083
index = tm.makeFloatIndex()
4081-
s = Series(np.arange(len(index))+10,index=index)
4084+
s = Series(np.arange(len(index))+10,index=index+5)
40824085

40834086
# these are all value based
4084-
result1 = s[2:5]
4085-
result2 = s.ix[2:5]
4086-
result3 = s.loc[2:5]
4087+
result1 = s[6:8]
4088+
result2 = s.ix[6:8]
4089+
result3 = s.loc[6:8]
40874090
assert_series_equal(result1, result2)
40884091
assert_series_equal(result1, result3)
40894092

40904093
# these are all valid
4091-
result1a = s[2.0:5]
4092-
result2a = s[2.0:5.0]
4093-
result3a = s[2:5.0]
4094+
result1a = s[6.0:8]
4095+
result2a = s[6.0:8.0]
4096+
result3a = s[6:8.0]
4097+
result1b = s[6.5:8]
4098+
result2b = s[6.5:8.5]
4099+
result3b = s[6:8.5]
40944100
assert_series_equal(result1a, result2a)
40954101
assert_series_equal(result1a, result3a)
4096-
4097-
result1b = s.ix[2.0:5]
4098-
result2b = s.ix[2.0:5.0]
4099-
result3b = s.ix[2:5.0]
4100-
assert_series_equal(result1b, result2b)
4101-
assert_series_equal(result1b, result3b)
4102-
4103-
result1c = s.loc[2.0:5]
4104-
result2c = s.loc[2.0:5.0]
4105-
result3c = s.loc[2:5.0]
4106-
assert_series_equal(result1c, result2c)
4107-
assert_series_equal(result1c, result3c)
4108-
41094102
assert_series_equal(result1a, result1b)
4103+
assert_series_equal(result1a, result2b)
4104+
assert_series_equal(result1a, result3b)
4105+
4106+
result1c = s.ix[6.0:8]
4107+
result2c = s.ix[6.0:8.0]
4108+
result3c = s.ix[6:8.0]
4109+
result1d = s.ix[6.5:8]
4110+
result2d = s.ix[6.5:8.5]
4111+
result3d = s.ix[6:8.5]
41104112
assert_series_equal(result1a, result1c)
4113+
assert_series_equal(result1a, result2c)
4114+
assert_series_equal(result1a, result3c)
4115+
assert_series_equal(result1a, result1d)
4116+
assert_series_equal(result1a, result2d)
4117+
assert_series_equal(result1a, result3d)
4118+
4119+
result1e = s.loc[6.0:8]
4120+
result2e = s.loc[6.0:8.0]
4121+
result3e = s.loc[6:8.0]
4122+
result1f = s.loc[6.5:8]
4123+
result2f = s.loc[6.5:8.5]
4124+
result3f = s.loc[6:8.5]
4125+
assert_series_equal(result1a, result1e)
4126+
assert_series_equal(result1a, result2e)
4127+
assert_series_equal(result1a, result3e)
4128+
assert_series_equal(result1a, result1f)
4129+
assert_series_equal(result1a, result2f)
4130+
assert_series_equal(result1a, result3f)
4131+
41114132

41124133
# these work for now
41134134
#self.assertRaises(TypeError, lambda : s.iloc[2.0:5])

0 commit comments

Comments
 (0)