Skip to content

Commit 28c1645

Browse files
committed
feat: Display index column in anywidget mode
1 parent 719b278 commit 28c1645

File tree

3 files changed

+221
-63
lines changed

3 files changed

+221
-63
lines changed

bigframes/display/anywidget.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def _cached_data(self) -> pd.DataFrame:
245245
"""Combine all cached batches into a single DataFrame."""
246246
if not self._cached_batches:
247247
return pd.DataFrame(columns=self._dataframe.columns)
248-
return pd.concat(self._cached_batches, ignore_index=True)
248+
return pd.concat(self._cached_batches)
249249

250250
def _reset_batch_cache(self) -> None:
251251
"""Resets batch caching attributes."""
@@ -294,7 +294,18 @@ def _set_table_html(self) -> None:
294294
break
295295

296296
# Get the data for the current page
297-
page_data = cached_data.iloc[start:end]
297+
page_data = cached_data.iloc[start:end].copy()
298+
299+
# Handle index display
300+
if hasattr(self._dataframe, "_has_index") and not self._dataframe._has_index:
301+
# No index to display
302+
pass
303+
elif page_data.index.name is not None:
304+
# Custom named index - include it with its actual name
305+
page_data.insert(0, page_data.index.name, page_data.index)
306+
else:
307+
# Default index - include as "Row" column
308+
page_data.insert(0, "Row", range(start + 1, start + len(page_data) + 1))
298309

299310
# Handle case where user navigated beyond available data with unknown row count
300311
is_unknown_count = self.row_count is None

notebooks/dataframes/anywidget_mode.ipynb

Lines changed: 76 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,17 @@
106106
"name": "stdout",
107107
"output_type": "stream",
108108
"text": [
109-
"state gender year name number\n",
110-
" AL F 1910 Vera 71\n",
111-
" AR F 1910 Viola 37\n",
112-
" AR F 1910 Alice 57\n",
113-
" AR F 1910 Edna 95\n",
114-
" AR F 1910 Ollie 40\n",
115-
" CA F 1910 Beatrice 37\n",
116-
" CT F 1910 Marion 36\n",
117-
" CT F 1910 Marie 36\n",
118-
" FL F 1910 Alice 53\n",
119-
" GA F 1910 Thelma 133\n",
109+
"state gender year name number\n",
110+
" AL F 1910 Cora 61\n",
111+
" AL F 1910 Anna 74\n",
112+
" AR F 1910 Willie 132\n",
113+
" CO F 1910 Anna 42\n",
114+
" FL F 1910 Louise 70\n",
115+
" GA F 1910 Catherine 57\n",
116+
" IL F 1910 Jessie 43\n",
117+
" IN F 1910 Anna 100\n",
118+
" IN F 1910 Pauline 77\n",
119+
" IN F 1910 Beulah 39\n",
120120
"...\n",
121121
"\n",
122122
"[5552452 rows x 5 columns]\n"
@@ -196,12 +196,12 @@
196196
{
197197
"data": {
198198
"application/vnd.jupyter.widget-view+json": {
199-
"model_id": "2aad385a8a2f411c822dafe7b07fbad8",
199+
"model_id": "41c9e91763d14c30a2a73bf1b1500add",
200200
"version_major": 2,
201201
"version_minor": 1
202202
},
203203
"text/html": [
204-
"<table border=\"1\" class=\"dataframe table table-striped table-hover\" id=\"table-4036e4dc-c2f5-4f7a-8e53-8b31df4a8e13\">\n",
204+
"<table border=\"1\" class=\"dataframe table table-striped table-hover\" id=\"table-9a877c46-5ccd-4c54-8c40-6d6962ff6991\">\n",
205205
" <thead>\n",
206206
" <tr style=\"text-align: left;\">\n",
207207
" <th style=\"text-align: left;\" class=\"sortable\"><div style=\"resize: horizontal; overflow: auto; box-sizing: border-box; width: 100%; height: 100%; padding: 0.5em;\">state</div></th>\n",
@@ -223,10 +223,10 @@
223223
" 1910\n",
224224
" </td>\n",
225225
" <td style=\"text-align: left; padding: 0.5em;\">\n",
226-
" Cora\n",
226+
" Lillian\n",
227227
" </td>\n",
228228
" <td style=\"text-align: right; padding: 0.5em;\">\n",
229-
" 61\n",
229+
" 99\n",
230230
" </td>\n",
231231
" </tr>\n",
232232
" <tr>\n",
@@ -240,15 +240,15 @@
240240
" 1910\n",
241241
" </td>\n",
242242
" <td style=\"text-align: left; padding: 0.5em;\">\n",
243-
" Anna\n",
243+
" Ruby\n",
244244
" </td>\n",
245245
" <td style=\"text-align: right; padding: 0.5em;\">\n",
246-
" 74\n",
246+
" 204\n",
247247
" </td>\n",
248248
" </tr>\n",
249249
" <tr>\n",
250250
" <td style=\"text-align: left; padding: 0.5em;\">\n",
251-
" AR\n",
251+
" AL\n",
252252
" </td>\n",
253253
" <td style=\"text-align: left; padding: 0.5em;\">\n",
254254
" F\n",
@@ -257,15 +257,15 @@
257257
" 1910\n",
258258
" </td>\n",
259259
" <td style=\"text-align: left; padding: 0.5em;\">\n",
260-
" Willie\n",
260+
" Helen\n",
261261
" </td>\n",
262262
" <td style=\"text-align: right; padding: 0.5em;\">\n",
263-
" 132\n",
263+
" 76\n",
264264
" </td>\n",
265265
" </tr>\n",
266266
" <tr>\n",
267267
" <td style=\"text-align: left; padding: 0.5em;\">\n",
268-
" CO\n",
268+
" AL\n",
269269
" </td>\n",
270270
" <td style=\"text-align: left; padding: 0.5em;\">\n",
271271
" F\n",
@@ -274,15 +274,15 @@
274274
" 1910\n",
275275
" </td>\n",
276276
" <td style=\"text-align: left; padding: 0.5em;\">\n",
277-
" Anna\n",
277+
" Eunice\n",
278278
" </td>\n",
279279
" <td style=\"text-align: right; padding: 0.5em;\">\n",
280-
" 42\n",
280+
" 41\n",
281281
" </td>\n",
282282
" </tr>\n",
283283
" <tr>\n",
284284
" <td style=\"text-align: left; padding: 0.5em;\">\n",
285-
" FL\n",
285+
" AR\n",
286286
" </td>\n",
287287
" <td style=\"text-align: left; padding: 0.5em;\">\n",
288288
" F\n",
@@ -291,15 +291,15 @@
291291
" 1910\n",
292292
" </td>\n",
293293
" <td style=\"text-align: left; padding: 0.5em;\">\n",
294-
" Louise\n",
294+
" Dora\n",
295295
" </td>\n",
296296
" <td style=\"text-align: right; padding: 0.5em;\">\n",
297-
" 70\n",
297+
" 42\n",
298298
" </td>\n",
299299
" </tr>\n",
300300
" <tr>\n",
301301
" <td style=\"text-align: left; padding: 0.5em;\">\n",
302-
" GA\n",
302+
" CA\n",
303303
" </td>\n",
304304
" <td style=\"text-align: left; padding: 0.5em;\">\n",
305305
" F\n",
@@ -308,15 +308,15 @@
308308
" 1910\n",
309309
" </td>\n",
310310
" <td style=\"text-align: left; padding: 0.5em;\">\n",
311-
" Catherine\n",
311+
" Edna\n",
312312
" </td>\n",
313313
" <td style=\"text-align: right; padding: 0.5em;\">\n",
314-
" 57\n",
314+
" 62\n",
315315
" </td>\n",
316316
" </tr>\n",
317317
" <tr>\n",
318318
" <td style=\"text-align: left; padding: 0.5em;\">\n",
319-
" IL\n",
319+
" CA\n",
320320
" </td>\n",
321321
" <td style=\"text-align: left; padding: 0.5em;\">\n",
322322
" F\n",
@@ -325,15 +325,15 @@
325325
" 1910\n",
326326
" </td>\n",
327327
" <td style=\"text-align: left; padding: 0.5em;\">\n",
328-
" Jessie\n",
328+
" Helen\n",
329329
" </td>\n",
330330
" <td style=\"text-align: right; padding: 0.5em;\">\n",
331-
" 43\n",
331+
" 239\n",
332332
" </td>\n",
333333
" </tr>\n",
334334
" <tr>\n",
335335
" <td style=\"text-align: left; padding: 0.5em;\">\n",
336-
" IN\n",
336+
" CO\n",
337337
" </td>\n",
338338
" <td style=\"text-align: left; padding: 0.5em;\">\n",
339339
" F\n",
@@ -342,15 +342,15 @@
342342
" 1910\n",
343343
" </td>\n",
344344
" <td style=\"text-align: left; padding: 0.5em;\">\n",
345-
" Anna\n",
345+
" Alice\n",
346346
" </td>\n",
347347
" <td style=\"text-align: right; padding: 0.5em;\">\n",
348-
" 100\n",
348+
" 46\n",
349349
" </td>\n",
350350
" </tr>\n",
351351
" <tr>\n",
352352
" <td style=\"text-align: left; padding: 0.5em;\">\n",
353-
" IN\n",
353+
" FL\n",
354354
" </td>\n",
355355
" <td style=\"text-align: left; padding: 0.5em;\">\n",
356356
" F\n",
@@ -359,15 +359,15 @@
359359
" 1910\n",
360360
" </td>\n",
361361
" <td style=\"text-align: left; padding: 0.5em;\">\n",
362-
" Pauline\n",
362+
" Willie\n",
363363
" </td>\n",
364364
" <td style=\"text-align: right; padding: 0.5em;\">\n",
365-
" 77\n",
365+
" 71\n",
366366
" </td>\n",
367367
" </tr>\n",
368368
" <tr>\n",
369369
" <td style=\"text-align: left; padding: 0.5em;\">\n",
370-
" IN\n",
370+
" FL\n",
371371
" </td>\n",
372372
" <td style=\"text-align: left; padding: 0.5em;\">\n",
373373
" F\n",
@@ -376,27 +376,27 @@
376376
" 1910\n",
377377
" </td>\n",
378378
" <td style=\"text-align: left; padding: 0.5em;\">\n",
379-
" Beulah\n",
379+
" Thelma\n",
380380
" </td>\n",
381381
" <td style=\"text-align: right; padding: 0.5em;\">\n",
382-
" 39\n",
382+
" 65\n",
383383
" </td>\n",
384384
" </tr>\n",
385385
" </tbody>\n",
386386
"</table>"
387387
],
388388
"text/plain": [
389-
"state gender year name number\n",
390-
" AL F 1910 Cora 61\n",
391-
" AL F 1910 Anna 74\n",
392-
" AR F 1910 Willie 132\n",
393-
" CO F 1910 Anna 42\n",
394-
" FL F 1910 Louise 70\n",
395-
" GA F 1910 Catherine 57\n",
396-
" IL F 1910 Jessie 43\n",
397-
" IN F 1910 Anna 100\n",
398-
" IN F 1910 Pauline 77\n",
399-
" IN F 1910 Beulah 39\n",
389+
"state gender year name number\n",
390+
" AL F 1910 Lillian 99\n",
391+
" AL F 1910 Ruby 204\n",
392+
" AL F 1910 Helen 76\n",
393+
" AL F 1910 Eunice 41\n",
394+
" AR F 1910 Dora 42\n",
395+
" CA F 1910 Edna 62\n",
396+
" CA F 1910 Helen 239\n",
397+
" CO F 1910 Alice 46\n",
398+
" FL F 1910 Willie 71\n",
399+
" FL F 1910 Thelma 65\n",
400400
"...\n",
401401
"\n",
402402
"[5552452 rows x 5 columns]"
@@ -482,12 +482,12 @@
482482
{
483483
"data": {
484484
"application/vnd.jupyter.widget-view+json": {
485-
"model_id": "0c0b83e7e3c048ff8abb525e1bfd6c5f",
485+
"model_id": "039d18f918004fa1b064832723aecfb8",
486486
"version_major": 2,
487487
"version_minor": 1
488488
},
489489
"text/plain": [
490-
"TableWidget(orderable_columns=['state', 'gender', 'year', 'name', 'number'], page_size=10, row_count=5552452, …"
490+
"<bigframes.display.anywidget.TableWidget object at 0x7f9316733250>"
491491
]
492492
},
493493
"execution_count": 7,
@@ -596,12 +596,12 @@
596596
{
597597
"data": {
598598
"application/vnd.jupyter.widget-view+json": {
599-
"model_id": "6a60e5dd37c64e76a8e3804dd3531f70",
599+
"model_id": "938f008b96e946678469b92ce85db809",
600600
"version_major": 2,
601601
"version_minor": 1
602602
},
603603
"text/plain": [
604-
"TableWidget(orderable_columns=['state', 'gender', 'year', 'name', 'number'], page_size=10, row_count=5, table_…"
604+
"<bigframes.display.anywidget.TableWidget object at 0x7f93170060d0>"
605605
]
606606
},
607607
"execution_count": 9,
@@ -636,7 +636,7 @@
636636
"data": {
637637
"text/html": [
638638
"✅ Completed. \n",
639-
" Query processed 85.9 kB in 14 seconds of slot time.\n",
639+
" Query processed 85.9 kB in 20 seconds of slot time.\n",
640640
" "
641641
],
642642
"text/plain": [
@@ -693,14 +693,15 @@
693693
{
694694
"data": {
695695
"application/vnd.jupyter.widget-view+json": {
696-
"model_id": "893065f8a0164648b241f2cc3d1a9271",
696+
"model_id": "c258523f7d07452d82367b7fcc0f4e79",
697697
"version_major": 2,
698698
"version_minor": 1
699699
},
700700
"text/html": [
701-
"<table border=\"1\" class=\"dataframe table table-striped table-hover\" id=\"table-531b95b3-561a-4b18-a203-89c867b7bddc\">\n",
701+
"<table border=\"1\" class=\"dataframe table table-striped table-hover\" id=\"table-71e7d816-3a82-433a-8f4b-7767d15365b1\">\n",
702702
" <thead>\n",
703703
" <tr style=\"text-align: left;\">\n",
704+
" <th style=\"text-align: left;\" ><div style=\"resize: horizontal; overflow: auto; box-sizing: border-box; width: 100%; height: 100%; padding: 0.5em;\">Row</div></th>\n",
704705
" <th style=\"text-align: left;\" ><div style=\"resize: horizontal; overflow: auto; box-sizing: border-box; width: 100%; height: 100%; padding: 0.5em;\">result</div></th>\n",
705706
" <th style=\"text-align: left;\" class=\"sortable\"><div style=\"resize: horizontal; overflow: auto; box-sizing: border-box; width: 100%; height: 100%; padding: 0.5em;\">gcs_path</div></th>\n",
706707
" <th style=\"text-align: left;\" class=\"sortable\"><div style=\"resize: horizontal; overflow: auto; box-sizing: border-box; width: 100%; height: 100%; padding: 0.5em;\">issuer</div></th>\n",
@@ -720,6 +721,9 @@
720721
" </thead>\n",
721722
" <tbody>\n",
722723
" <tr>\n",
724+
" <td style=\"text-align: right; padding: 0.5em;\">\n",
725+
" 1\n",
726+
" </td>\n",
723727
" <td style=\"text-align: left; padding: 0.5em;\">\n",
724728
" {&#x27;application_number&#x27;: None, &#x27;class_international&#x27;: None, &#x27;filing_date&#x27;: None, &#x27;publication_date&#x27;: None, &#x27;full_response&#x27;: &#x27;{}&#x27;, &#x27;status&#x27;: &#x27;INVALID_ARGUMENT: Invalid field in objectref details, only a JSON object named gcs_metadata is allowed [type.googleapis.com/util.MessageSetPayload=\\&#x27;[dremel.DremelErrorWithDetails] { argument_error { query_error { } } debug_info { error_message_template: &quot;Invalid field in objectref details, only a JSON object named $0 is allowed&quot; error_id: 3270173750 } }\\&#x27;]&#x27;}\n",
725729
" </td>\n",
@@ -767,6 +771,9 @@
767771
" </td>\n",
768772
" </tr>\n",
769773
" <tr>\n",
774+
" <td style=\"text-align: right; padding: 0.5em;\">\n",
775+
" 2\n",
776+
" </td>\n",
770777
" <td style=\"text-align: left; padding: 0.5em;\">\n",
771778
" {&#x27;application_number&#x27;: None, &#x27;class_international&#x27;: None, &#x27;filing_date&#x27;: None, &#x27;publication_date&#x27;: None, &#x27;full_response&#x27;: &#x27;{}&#x27;, &#x27;status&#x27;: &#x27;INVALID_ARGUMENT: Invalid field in objectref details, only a JSON object named gcs_metadata is allowed [type.googleapis.com/util.MessageSetPayload=\\&#x27;[dremel.DremelErrorWithDetails] { argument_error { query_error { } } debug_info { error_message_template: &quot;Invalid field in objectref details, only a JSON object named $0 is allowed&quot; error_id: 3270173750 } }\\&#x27;]&#x27;}\n",
772779
" </td>\n",
@@ -814,6 +821,9 @@
814821
" </td>\n",
815822
" </tr>\n",
816823
" <tr>\n",
824+
" <td style=\"text-align: right; padding: 0.5em;\">\n",
825+
" 3\n",
826+
" </td>\n",
817827
" <td style=\"text-align: left; padding: 0.5em;\">\n",
818828
" {&#x27;application_number&#x27;: None, &#x27;class_international&#x27;: None, &#x27;filing_date&#x27;: None, &#x27;publication_date&#x27;: None, &#x27;full_response&#x27;: &#x27;{}&#x27;, &#x27;status&#x27;: &#x27;INVALID_ARGUMENT: Invalid field in objectref details, only a JSON object named gcs_metadata is allowed [type.googleapis.com/util.MessageSetPayload=\\&#x27;[dremel.DremelErrorWithDetails] { argument_error { query_error { } } debug_info { error_message_template: &quot;Invalid field in objectref details, only a JSON object named $0 is allowed&quot; error_id: 3270173750 } }\\&#x27;]&#x27;}\n",
819829
" </td>\n",
@@ -861,6 +871,9 @@
861871
" </td>\n",
862872
" </tr>\n",
863873
" <tr>\n",
874+
" <td style=\"text-align: right; padding: 0.5em;\">\n",
875+
" 4\n",
876+
" </td>\n",
864877
" <td style=\"text-align: left; padding: 0.5em;\">\n",
865878
" {&#x27;application_number&#x27;: None, &#x27;class_international&#x27;: None, &#x27;filing_date&#x27;: None, &#x27;publication_date&#x27;: None, &#x27;full_response&#x27;: &#x27;{}&#x27;, &#x27;status&#x27;: &#x27;INVALID_ARGUMENT: Invalid field in objectref details, only a JSON object named gcs_metadata is allowed [type.googleapis.com/util.MessageSetPayload=\\&#x27;[dremel.DremelErrorWithDetails] { argument_error { query_error { } } debug_info { error_message_template: &quot;Invalid field in objectref details, only a JSON object named $0 is allowed&quot; error_id: 3270173750 } }\\&#x27;]&#x27;}\n",
866879
" </td>\n",
@@ -908,6 +921,9 @@
908921
" </td>\n",
909922
" </tr>\n",
910923
" <tr>\n",
924+
" <td style=\"text-align: right; padding: 0.5em;\">\n",
925+
" 5\n",
926+
" </td>\n",
911927
" <td style=\"text-align: left; padding: 0.5em;\">\n",
912928
" {&#x27;application_number&#x27;: None, &#x27;class_international&#x27;: None, &#x27;filing_date&#x27;: None, &#x27;publication_date&#x27;: None, &#x27;full_response&#x27;: &#x27;{}&#x27;, &#x27;status&#x27;: &#x27;INVALID_ARGUMENT: Invalid field in objectref details, only a JSON object named gcs_metadata is allowed [type.googleapis.com/util.MessageSetPayload=\\&#x27;[dremel.DremelErrorWithDetails] { argument_error { query_error { } } debug_info { error_message_template: &quot;Invalid field in objectref details, only a JSON object named $0 is allowed&quot; error_id: 3270173750 } }\\&#x27;]&#x27;}\n",
913929
" </td>\n",
@@ -1038,7 +1054,7 @@
10381054
"name": "python",
10391055
"nbconvert_exporter": "python",
10401056
"pygments_lexer": "ipython3",
1041-
"version": "3.10.15"
1057+
"version": "3.11.10"
10421058
}
10431059
},
10441060
"nbformat": 4,

0 commit comments

Comments
 (0)