Skip to content

Commit 3839f64

Browse files
committed
ENH: better string element access/slicing notation close #1656
1 parent 930652f commit 3839f64

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

pandas/core/strings.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ def str_split(arr, pat, n=0):
506506
return _na_map(f, arr)
507507

508508

509-
def str_slice(arr, start=None, stop=None):
509+
def str_slice(arr, start=None, stop=None, step=1):
510510
"""
511511
Slice substrings from each element in array
512512
@@ -519,7 +519,7 @@ def str_slice(arr, start=None, stop=None):
519519
-------
520520
sliced : array
521521
"""
522-
obj = slice(start, stop)
522+
obj = slice(start, stop, step)
523523
f = lambda x: x[obj]
524524
return _na_map(f, arr)
525525

@@ -649,6 +649,13 @@ class StringMethods(object):
649649
def __init__(self, series):
650650
self.series = series
651651

652+
def __getitem__(self, key):
653+
if isinstance(key, slice):
654+
return self.slice(start=key.start, stop=key.stop,
655+
step=key.step)
656+
else:
657+
return self.get(key)
658+
652659
def _wrap_result(self, result):
653660
return Series(result, index=self.series.index,
654661
name=self.series.name)
@@ -699,7 +706,7 @@ def center(self, width):
699706
return self._wrap_result(result)
700707

701708
@copy(str_slice)
702-
def slice(self, start=None, stop=None):
709+
def slice(self, start=None, stop=None, step=1):
703710
result = str_slice(self.series, start, stop)
704711
return self._wrap_result(result)
705712

pandas/tests/test_strings.py

+12
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,18 @@ def test_more_replace(self):
626626
'XX-XX BA', 'XX-XX ', 'XX-XX t'])
627627
assert_series_equal(result, expected)
628628

629+
def test_string_slice_get_syntax(self):
630+
s = Series(['YYY', 'B', 'C', 'YYYYYYbYYY', 'BYYYcYYY', NA,
631+
'CYYYBYYY', 'dog', 'cYYYt'])
632+
633+
result = s.str[0]
634+
expected = s.str.get(0)
635+
assert_series_equal(result, expected)
636+
637+
result = s.str[:3]
638+
expected = s.str.slice(stop=3)
639+
assert_series_equal(result, expected)
640+
629641
if __name__ == '__main__':
630642
nose.runmodule(argv=[__file__,'-vvs','-x','--pdb', '--pdb-failure'],
631643
exit=False)

0 commit comments

Comments
 (0)