cudf
cudf copied to clipboard
[BUG] Unable to perform setitem operations on slices of `struct` and `list` columns
Describe the bug
When we want to fill a slice of a series column of type struct or list, there is an error.
Steps/Code to reproduce bug
In [49]: s = cudf.Series([[1, 2], [2, 3], [3, 4], [4, 5], [6, 7]])
In [50]: s
Out[50]:
0 [1, 2]
1 [2, 3]
2 [3, 4]
3 [4, 5]
4 [6, 7]
dtype: list
In [51]: s[slice(0, 3, 1)]
Out[51]:
0 [1, 2]
1 [2, 3]
2 [3, 4]
dtype: list
In [52]: s[slice(0, 3, 1)] = cudf.Scalar([10, 11])
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Cell In [52], line 1
----> 1 s[slice(0, 3, 1)] = cudf.Scalar([10, 11])
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/contextlib.py:79, in ContextDecorator.__call__.<locals>.inner(*args, **kwds)
76 @wraps(func)
77 def inner(*args, **kwds):
78 with self._recreate_cm():
---> 79 return func(*args, **kwds)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/series.py:1182, in Series.__setitem__(self, key, value)
1179 @_cudf_nvtx_annotate
1180 def __setitem__(self, key, value):
1181 if isinstance(key, slice):
-> 1182 self.iloc[key] = value
1183 else:
1184 self.loc[key] = value
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/contextlib.py:79, in ContextDecorator.__call__.<locals>.inner(*args, **kwds)
76 @wraps(func)
77 def inner(*args, **kwds):
78 with self._recreate_cm():
---> 79 return func(*args, **kwds)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/series.py:235, in _SeriesIlocIndexer.__setitem__(self, key, value)
230 if self._frame._column.dtype != to_dtype:
231 self._frame._column._mimic_inplace(
232 self._frame._column.astype(to_dtype), inplace=True
233 )
--> 235 self._frame._column[key] = value
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/lists.py:99, in ListColumn.__setitem__(self, key, value)
97 else:
98 raise ValueError(f"Can not set {value} into ListColumn")
---> 99 super().__setitem__(key, value)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/column.py:525, in ColumnBase.__setitem__(self, key, value)
523 out: Optional[ColumnBase] # If None, no need to perform mimic inplace.
524 if isinstance(key, slice):
--> 525 out = self._scatter_by_slice(key, value_normalized)
526 else:
527 key = as_column(key)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/column.py:557, in ColumnBase._scatter_by_slice(self, key, value)
555 if step == 1:
556 if isinstance(value, cudf.core.scalar.Scalar):
--> 557 return self._fill(value, start, stop, inplace=True)
558 else:
559 return libcudf.copying.copy_range(
560 value, self, 0, num_keys, start, stop, False
561 )
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/column.py:349, in ColumnBase._fill(self, fill_value, begin, end, inplace)
346 mask = create_null_mask(self.size, state=MaskState.ALL_VALID)
347 self.set_base_mask(mask)
--> 349 libcudf.filling.fill_in_place(self, begin, end, slr.device_value)
351 return self
File filling.pyx:31, in cudf._lib.filling.fill_in_place()
RuntimeError: cuDF failure at: /nvme/0/pgali/cudf/cpp/src/filling/fill.cu:214: In-place fill does not support variable-sized types.
In [55]: s = cudf.Series([{'a':10, 'b':11}])
In [56]: s
Out[56]:
0 {'a': 10, 'b': 11}
dtype: struct
In [57]: s[0] = {'a':12, 'b':5}
In [58]: s
Out[58]:
0 {'a': 12, 'b': 5}
dtype: struct
In [59]: s
Out[59]:
0 {'a': 12, 'b': 5}
dtype: struct
In [60]: s[slice(0, 1, 1)]
Out[60]:
0 {'a': 12, 'b': 5}
dtype: struct
In [61]: s[slice(0, 1, 1)] = cudf.Scalar({'a':100, 'b':1})
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Cell In [61], line 1
----> 1 s[slice(0, 1, 1)] = cudf.Scalar({'a':100, 'b':1})
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/contextlib.py:79, in ContextDecorator.__call__.<locals>.inner(*args, **kwds)
76 @wraps(func)
77 def inner(*args, **kwds):
78 with self._recreate_cm():
---> 79 return func(*args, **kwds)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/series.py:1182, in Series.__setitem__(self, key, value)
1179 @_cudf_nvtx_annotate
1180 def __setitem__(self, key, value):
1181 if isinstance(key, slice):
-> 1182 self.iloc[key] = value
1183 else:
1184 self.loc[key] = value
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/contextlib.py:79, in ContextDecorator.__call__.<locals>.inner(*args, **kwds)
76 @wraps(func)
77 def inner(*args, **kwds):
78 with self._recreate_cm():
---> 79 return func(*args, **kwds)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/series.py:235, in _SeriesIlocIndexer.__setitem__(self, key, value)
230 if self._frame._column.dtype != to_dtype:
231 self._frame._column._mimic_inplace(
232 self._frame._column.astype(to_dtype), inplace=True
233 )
--> 235 self._frame._column[key] = value
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/struct.py:82, in StructColumn.__setitem__(self, key, value)
79 value[field] = value.get(field, NA)
81 value = cudf.Scalar(value, self.dtype)
---> 82 super().__setitem__(key, value)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/column.py:525, in ColumnBase.__setitem__(self, key, value)
523 out: Optional[ColumnBase] # If None, no need to perform mimic inplace.
524 if isinstance(key, slice):
--> 525 out = self._scatter_by_slice(key, value_normalized)
526 else:
527 key = as_column(key)
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/column.py:557, in ColumnBase._scatter_by_slice(self, key, value)
555 if step == 1:
556 if isinstance(value, cudf.core.scalar.Scalar):
--> 557 return self._fill(value, start, stop, inplace=True)
558 else:
559 return libcudf.copying.copy_range(
560 value, self, 0, num_keys, start, stop, False
561 )
File /nvme/0/pgali/envs/cudfdev/lib/python3.9/site-packages/cudf/core/column/column.py:349, in ColumnBase._fill(self, fill_value, begin, end, inplace)
346 mask = create_null_mask(self.size, state=MaskState.ALL_VALID)
347 self.set_base_mask(mask)
--> 349 libcudf.filling.fill_in_place(self, begin, end, slr.device_value)
351 return self
File filling.pyx:31, in cudf._lib.filling.fill_in_place()
RuntimeError: cuDF failure at: /nvme/0/pgali/cudf/cpp/src/filling/fill.cu:214: In-place fill does not support variable-sized types.
Expected behavior We should be able to fill the values without hitting the inplace replace methods of libcudf for these two types specifically.
Environment overview (please complete the following information)
- Environment location: [Bare-metal]
- Method of cuDF install: [from source]
Additional context Required for https://github.com/rapidsai/cudf/pull/11718