Skip to content

Commit 2d16f6d

Browse files
fix: Remove index requirement from some dataframe APIs (#1073)
1 parent 103e998 commit 2d16f6d

File tree

4 files changed

+65
-8
lines changed

4 files changed

+65
-8
lines changed

bigframes/bigquery/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -493,8 +493,8 @@ def vector_search(
493493
)
494494
if index_col_ids is not None:
495495
df = query._session.read_gbq(sql, index_col=index_col_ids)
496+
df.index.names = index_labels
496497
else:
497498
df = query._session.read_gbq(sql)
498-
df.index.names = index_labels
499499

500500
return df

bigframes/core/eval.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,15 @@ def eval(df: dataframe.DataFrame, expr: str, target: Optional[dataframe.DataFram
3838
Returns:
3939
Result of evaluation.
4040
"""
41-
index_resolver = {
42-
vendored_pandas_eval_parsing.clean_column_name(str(name)): EvalSeries(
43-
df.index.get_level_values(level).to_series()
44-
)
45-
for level, name in enumerate(df.index.names)
46-
}
41+
if df._has_index:
42+
index_resolver = {
43+
vendored_pandas_eval_parsing.clean_column_name(str(name)): EvalSeries(
44+
df.index.get_level_values(level).to_series()
45+
)
46+
for level, name in enumerate(df.index.names)
47+
}
48+
else:
49+
index_resolver = {}
4750
column_resolver = {
4851
vendored_pandas_eval_parsing.clean_column_name(str(name)): EvalSeries(series)
4952
for name, series in df.items()

bigframes/dataframe.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ def _apply_series_binop_axis_0(
768768
reverse: bool = False,
769769
) -> DataFrame:
770770
bf_series = bigframes.core.convert.to_bf_series(
771-
other, self.index, self._session
771+
other, self.index if self._has_index else None, self._session
772772
)
773773
aligned_block, columns, expr_pairs = self._block._align_axis_0(
774774
bf_series._block, how=how
@@ -3179,6 +3179,7 @@ def to_gbq(
31793179
clustering_columns: Union[pandas.Index, Iterable[typing.Hashable]] = (),
31803180
labels: dict[str, str] = {},
31813181
) -> str:
3182+
index = index and self._has_index
31823183
temp_table_ref = None
31833184

31843185
if destination_table is None:

tests/system/small/test_null_index.py

+53
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,23 @@
2121
from tests.system.utils import skip_legacy_pandas
2222

2323

24+
def test_null_index_to_gbq(session, scalars_df_null_index, dataset_id_not_created):
25+
dataset_id = dataset_id_not_created
26+
destination_table = f"{dataset_id}.scalars_df_unindexed"
27+
28+
result_table = scalars_df_null_index.to_gbq(
29+
destination_table, clustering_columns=["int64_col"]
30+
)
31+
assert (
32+
result_table == destination_table
33+
if destination_table
34+
else result_table is not None
35+
)
36+
37+
loaded_scalars_df_index = session.read_gbq(result_table)
38+
assert not loaded_scalars_df_index.empty
39+
40+
2441
def test_null_index_materialize(scalars_df_null_index, scalars_pandas_df_default_index):
2542
bf_result = scalars_df_null_index.to_pandas()
2643
pd.testing.assert_frame_equal(
@@ -83,6 +100,23 @@ def test_null_index_aggregate(scalars_df_null_index, scalars_pandas_df_default_i
83100
)
84101

85102

103+
def test_null_index_binop_series_axis_0(
104+
scalars_df_null_index, scalars_pandas_df_default_index
105+
):
106+
bf_result = (
107+
scalars_df_null_index[["int64_col", "int64_too"]]
108+
.add(scalars_df_null_index["int64_col"], axis=0)
109+
.to_pandas()
110+
)
111+
pd_result = scalars_pandas_df_default_index[["int64_col", "int64_too"]].add(
112+
scalars_pandas_df_default_index.int64_col, axis=0
113+
)
114+
115+
pd.testing.assert_frame_equal(
116+
bf_result, pd_result, check_dtype=False, check_index_type=False
117+
)
118+
119+
86120
def test_null_index_groupby_aggregate(
87121
scalars_df_null_index, scalars_pandas_df_default_index
88122
):
@@ -139,6 +173,25 @@ def test_null_index_merge_left_null_index_object(
139173
assert got.shape == expected.shape
140174

141175

176+
@skip_legacy_pandas
177+
@pytest.mark.parametrize(
178+
("expr",),
179+
[
180+
("new_col = int64_col + int64_too",),
181+
("new_col = (rowindex > 3) | bool_col",),
182+
("int64_too = bool_col\nnew_col2 = rowindex",),
183+
],
184+
)
185+
def test_null_index_df_eval(
186+
scalars_df_null_index, scalars_pandas_df_default_index, expr
187+
):
188+
189+
bf_result = scalars_df_null_index.eval(expr).to_pandas()
190+
pd_result = scalars_pandas_df_default_index.eval(expr)
191+
192+
pd.testing.assert_frame_equal(bf_result, pd_result, check_index_type=False)
193+
194+
142195
def test_null_index_merge_right_null_index_object(
143196
scalars_df_null_index, scalars_df_default_index, scalars_pandas_df_default_index
144197
):

0 commit comments

Comments
 (0)