diff --git a/pandas/core/dtypes/missing.py b/pandas/core/dtypes/missing.py index af3a873bc2866..9913923cb7807 100644 --- a/pandas/core/dtypes/missing.py +++ b/pandas/core/dtypes/missing.py @@ -394,3 +394,10 @@ def na_value_for_dtype(dtype): elif is_bool_dtype(dtype): return False return np.nan + + +def remove_na_arraylike(arr): + """ + Return array-like containing only true/non-NaN values, possibly empty. + """ + return arr[notnull(lib.values_from_object(arr))] diff --git a/pandas/core/series.py b/pandas/core/series.py index e1f668dd3afda..98b548f8ab3b5 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -36,7 +36,7 @@ maybe_upcast, infer_dtype_from_scalar, maybe_convert_platform, maybe_cast_to_datetime, maybe_castable) -from pandas.core.dtypes.missing import isnull, notnull +from pandas.core.dtypes.missing import isnull, notnull, remove_na_arraylike from pandas.core.common import (is_bool_indexer, _default_index, @@ -2749,7 +2749,7 @@ def dropna(self, axis=0, inplace=False, **kwargs): axis = self._get_axis_number(axis or 0) if self._can_hold_na: - result = remove_na(self) + result = remove_na_arraylike(self) if inplace: self._update_inplace(result) else: @@ -2888,13 +2888,6 @@ def _dir_additions(self): # Supplementary functions -def remove_na(series): - """ - Return series containing only true/non-NaN values, possibly empty. - """ - return series[notnull(_values_from_object(series))] - - def _sanitize_index(data, index, copy=False): """ sanitize an index type to return an ndarray of the underlying, pass thru a non-Index diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index f8e83aea03594..9cceebb5c4cdb 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -11,7 +11,7 @@ from pandas.util._decorators import cache_readonly from pandas.core.base import PandasObject -from pandas.core.dtypes.missing import notnull +from pandas.core.dtypes.missing import notnull, remove_na_arraylike from pandas.core.dtypes.common import ( is_list_like, is_integer, @@ -21,7 +21,7 @@ from pandas.core.common import AbstractMethodError, isnull, _try_sort from pandas.core.generic import _shared_docs, _shared_doc_kwargs from pandas.core.index import Index, MultiIndex -from pandas.core.series import Series, remove_na +from pandas.core.series import Series from pandas.core.indexes.period import PeriodIndex from pandas.compat import range, lrange, map, zip, string_types import pandas.compat as compat @@ -1376,7 +1376,7 @@ def _plot(cls, ax, y, style=None, bw_method=None, ind=None, from scipy.stats import gaussian_kde from scipy import __version__ as spv - y = remove_na(y) + y = remove_na_arraylike(y) if LooseVersion(spv) >= '0.11.0': gkde = gaussian_kde(y, bw_method=bw_method) @@ -1495,13 +1495,13 @@ def _args_adjust(self): @classmethod def _plot(cls, ax, y, column_num=None, return_type='axes', **kwds): if y.ndim == 2: - y = [remove_na(v) for v in y] + y = [remove_na_arraylike(v) for v in y] # Boxplot fails with empty arrays, so need to add a NaN # if any cols are empty # GH 8181 y = [v if v.size > 0 else np.array([np.nan]) for v in y] else: - y = remove_na(y) + y = remove_na_arraylike(y) bp = ax.boxplot(y, **kwds) if return_type == 'dict': @@ -1969,7 +1969,7 @@ def maybe_color_bp(bp): def plot_group(keys, values, ax): keys = [pprint_thing(x) for x in keys] - values = [remove_na(v) for v in values] + values = [remove_na_arraylike(v) for v in values] bp = ax.boxplot(values, **kwds) if fontsize is not None: ax.tick_params(axis='both', labelsize=fontsize) diff --git a/pandas/tests/test_panel.py b/pandas/tests/test_panel.py index e19e42e062932..445611c1696f5 100644 --- a/pandas/tests/test_panel.py +++ b/pandas/tests/test_panel.py @@ -10,11 +10,11 @@ import pandas as pd from pandas.core.dtypes.common import is_float_dtype +from pandas.core.dtypes.missing import remove_na_arraylike from pandas import (Series, DataFrame, Index, date_range, isnull, notnull, pivot, MultiIndex) from pandas.core.nanops import nanall, nanany from pandas.core.panel import Panel -from pandas.core.series import remove_na from pandas.io.formats.printing import pprint_thing from pandas import compat @@ -155,7 +155,7 @@ def _check_stat_op(self, name, alternative, obj=None, has_skipna=True): if has_skipna: def skipna_wrapper(x): - nona = remove_na(x) + nona = remove_na_arraylike(x) if len(nona) == 0: return np.nan return alternative(nona) diff --git a/pandas/tests/test_panel4d.py b/pandas/tests/test_panel4d.py index e1995316e7b7c..18643aff15e9b 100644 --- a/pandas/tests/test_panel4d.py +++ b/pandas/tests/test_panel4d.py @@ -7,10 +7,10 @@ import numpy as np from pandas.core.dtypes.common import is_float_dtype +from pandas.core.dtypes.missing import remove_na_arraylike from pandas import Series, Index, isnull, notnull from pandas.core.panel import Panel from pandas.core.panel4d import Panel4D -from pandas.core.series import remove_na from pandas.tseries.offsets import BDay from pandas.util.testing import (assert_frame_equal, assert_series_equal, @@ -118,7 +118,7 @@ def _check_stat_op(self, name, alternative, obj=None, has_skipna=True): if has_skipna: def skipna_wrapper(x): - nona = remove_na(x) + nona = remove_na_arraylike(x) if len(nona) == 0: return np.nan return alternative(nona)