Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ArrayManager] ENH: ArrayManager.convert without block fallback #40196

Merged
merged 2 commits into from
Mar 5, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions pandas/core/internals/array_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
astype_array_safe,
find_common_type,
infer_dtype_from_scalar,
soft_convert_objects,
)
from pandas.core.dtypes.common import (
is_bool_dtype,
Expand Down Expand Up @@ -515,13 +516,19 @@ def convert(
numeric: bool = True,
timedelta: bool = True,
) -> ArrayManager:
return self.apply_with_block(
"convert",
copy=copy,
datetime=datetime,
numeric=numeric,
timedelta=timedelta,
)
def _convert(arr):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not pretty but ok

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's not pretty about it? The inline function?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

soft_convert_objects can just do this directly right? (or the copy keyword is not functioning)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently soft_convert_objects assumes the input is object dtype, and doesn't do such checking. I assume the check could be moved into soft_convert_objects as well (although eg for Block, which has an ObjectBlock, it knows it is ndarray[object], and such an additional check would be unnecessary)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW soft_convert_objects is only used for ObjectBlock.convert ATM, so no real harm in making it handle non-object with these extra two lines (though to get effective simplification in the BM code might need to tweak copy kwarg behavior)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok if would revisit / consolidate logic at some point here.

if is_object_dtype(arr.dtype):
return soft_convert_objects(
arr,
datetime=datetime,
numeric=numeric,
timedelta=timedelta,
copy=copy,
)
else:
return arr.copy() if copy else arr

return self.apply(_convert)

def replace(self, value, **kwargs) -> ArrayManager:
assert np.ndim(value) == 0, value
Expand Down