diff --git a/bigframes/dataframe.py b/bigframes/dataframe.py index 9c90ad5b5f..2131008741 100644 --- a/bigframes/dataframe.py +++ b/bigframes/dataframe.py @@ -1062,12 +1062,31 @@ def drop( level_id = self._resolve_levels(level or 0)[0] if utils.is_list_like(index): - block, inverse_condition_id = block.apply_unary_op( - level_id, ops.IsInOp(index, match_nulls=True) - ) - block, condition_id = block.apply_unary_op( - inverse_condition_id, ops.invert_op - ) + # Only tuple is treated as multi-index value combinations + if isinstance(index, tuple): + if level is not None: + raise ValueError("Multi-index tuple can't specify level.") + condition_id = None + for i, idx in enumerate(index): + level_id = self._resolve_levels(i)[0] + block, condition_id_cur = block.apply_unary_op( + level_id, ops.partial_right(ops.ne_op, idx) + ) + if condition_id: + block, condition_id = block.apply_binary_op( + condition_id, condition_id_cur, ops.or_op + ) + else: + condition_id = condition_id_cur + + condition_id = typing.cast(str, condition_id) + else: + block, inverse_condition_id = block.apply_unary_op( + level_id, ops.IsInOp(index, match_nulls=True) + ) + block, condition_id = block.apply_unary_op( + inverse_condition_id, ops.invert_op + ) elif isinstance(index, indexes.Index): return self._drop_by_index(index) else: diff --git a/tests/system/small/test_multiindex.py b/tests/system/small/test_multiindex.py index 058adb9390..d767b30bd6 100644 --- a/tests/system/small/test_multiindex.py +++ b/tests/system/small/test_multiindex.py @@ -234,6 +234,7 @@ def test_series_multi_index_droplevel(scalars_df_index, scalars_pandas_df_index, (1, 0), ([0, 1], 0), ([True, None], 1), + ((0, True), None), ], ) def test_multi_index_drop(scalars_df_index, scalars_pandas_df_index, labels, level): diff --git a/third_party/bigframes_vendored/pandas/core/frame.py b/third_party/bigframes_vendored/pandas/core/frame.py index 66ed2088e4..bca18bd0b7 100644 --- a/third_party/bigframes_vendored/pandas/core/frame.py +++ b/third_party/bigframes_vendored/pandas/core/frame.py @@ -1107,7 +1107,7 @@ def drop( Args: labels: - Index or column labels to drop. + Index or column labels to drop. A tuple will be used as a single label and not treated as a list-like. axis: Whether to drop labels from the index (0 or 'index') or columns (1 or 'columns').