diff --git a/doc/source/whatsnew/v0.17.0.txt b/doc/source/whatsnew/v0.17.0.txt index 4a513f3122390..5585dfde69ac5 100644 --- a/doc/source/whatsnew/v0.17.0.txt +++ b/doc/source/whatsnew/v0.17.0.txt @@ -26,7 +26,8 @@ New features Other enhancements ^^^^^^^^^^^^^^^^^^ - +- ``regex`` argument to ``DataFrame.filter`` now handles numeric column names instead of raising ``ValueError`` (:issue:`10384`). + .. _whatsnew_0170.api: Backwards incompatible API changes diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 35db4051c60c8..e7ce4c2891114 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -1928,7 +1928,7 @@ def filter(self, items=None, like=None, regex=None, axis=None): return self.select(matchf, axis=axis_name) elif regex: matcher = re.compile(regex) - return self.select(lambda x: matcher.search(x) is not None, + return self.select(lambda x: matcher.search(str(x)) is not None, axis=axis_name) else: raise TypeError('Must pass either `items`, `like`, or `regex`') diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index a4abe481cfe81..1072aa3ba8871 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -10741,7 +10741,7 @@ def test_filter(self): idx = self.frame.index[0:4] filtered = self.frame.filter(idx, axis='index') expected = self.frame.reindex(index=idx) - assert_frame_equal(filtered,expected) + assert_frame_equal(filtered, expected) # like fcopy = self.frame.copy() @@ -10755,6 +10755,17 @@ def test_filter(self): df = DataFrame(0., index=[0, 1, 2], columns=[0, 1, '_A', '_B']) filtered = df.filter(like='_') self.assertEqual(len(filtered.columns), 2) + + # regex with ints in column names + # from PR #10384 + df = DataFrame(0., index=[0, 1, 2], columns=['A1', 1, 'B', 2, 'C']) + expected = DataFrame(0., index=[0, 1, 2], columns=[1, 2]) + filtered = df.filter(regex='^[0-9]+$') + self.assert_frame_equal(filtered, expected) + + expected = DataFrame(0., index=[0, 1, 2], columns=[0, 1, '0', '1']) + filtered = expected.filter(regex='^[0-9]+$') # shouldn't remove anything + self.assert_frame_equal(filtered, expected) # pass in None with assertRaisesRegexp(TypeError, 'Must pass'):