Skip to content

Commit

Permalink
Support creating Series from mixed python objects if all else fails. (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
ghuls committed Nov 27, 2021
1 parent 7c40c0c commit 2796f4e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 21 deletions.
36 changes: 20 additions & 16 deletions py-polars/polars/internals/construction.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,22 +131,26 @@ def sequence_to_pyseries(

if not _PYARROW_AVAILABLE: # pragma: no cover
dtype = py_type_to_dtype(nested_dtype)
return PySeries.new_list(name, values, dtype)

try:
nested_arrow_dtype = py_type_to_arrow_type(nested_dtype)
except ValueError as e: # pragma: no cover
raise ValueError(
f"Cannot construct Series from sequence of {nested_dtype}."
) from e

try:
arrow_values = pa.array(values, pa.large_list(nested_arrow_dtype))
return arrow_to_pyseries(name, arrow_values)
# failure expected for mixed sequences like `[[12], "foo", 9]`
except pa.lib.ArrowInvalid:
return PySeries.new_object(name, values, strict)

try:
return PySeries.new_list(name, values, dtype)
except BaseException:
pass
else:
try:
nested_arrow_dtype = py_type_to_arrow_type(nested_dtype)
except ValueError as e:
raise ValueError(
f"Cannot construct Series from sequence of {nested_dtype}."
) from e

try:
arrow_values = pa.array(values, pa.large_list(nested_arrow_dtype))
return arrow_to_pyseries(name, arrow_values)
except pa.lib.ArrowInvalid:
pass

# Convert mixed sequences like `[[12], "foo", 9]`
return PySeries.new_object(name, values, strict)
else:
constructor = py_type_to_constructor(dtype_)
return constructor(name, values, strict)
Expand Down
8 changes: 3 additions & 5 deletions py-polars/tests/test_series.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,11 +365,9 @@ def test_shape() -> None:


def test_create_list_series() -> None:
pass
# may Segfault: see https://github.com/pola-rs/polars/issues/518
# a = [[1, 2], None, [None, 3]]
# s = pl.Series("", a)
# assert s.to_list() == a
a = [[1, 2], None, [None, 3]]
s = pl.Series("", a)
assert s.to_list() == a


def test_iter() -> None:
Expand Down

0 comments on commit 2796f4e

Please sign in to comment.