Skip to content

Commit 689e202

Browse files
author
Tim Shawver
committed
Call 'str' on index columns that have an object or categorical dtype (we were already doing this on non-index columns).
1 parent 19e135e commit 689e202

2 files changed

Lines changed: 42 additions & 7 deletions

File tree

qgrid/grid.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -748,16 +748,36 @@ def _update_table(self,
748748

749749
self._row_count = len(self._df.index)
750750

751-
if type(df.index) == pd.core.index.MultiIndex:
752-
self._multi_index = True
753-
else:
754-
self._multi_index = False
755-
756751
if update_columns:
757752
self._string_columns = list(df.select_dtypes(
758753
include=[np.dtype('O'), 'category']
759754
).columns.values)
760755

756+
def should_be_stringified(col_series):
757+
return col_series.dtype == np.dtype('O') or \
758+
hasattr(col_series, 'cat')
759+
760+
if type(df.index) == pd.core.index.MultiIndex:
761+
self._multi_index = True
762+
for idx, cur_level in enumerate(df.index.levels):
763+
if cur_level.name:
764+
col_name = cur_level.name
765+
else:
766+
col_name = 'level_%s' % idx
767+
self._primary_key.append(col_name)
768+
if should_be_stringified(cur_level):
769+
self._string_columns.append(col_name)
770+
else:
771+
self._multi_index = False
772+
if df.index.name:
773+
col_name = df.index.name
774+
else:
775+
col_name = 'index'
776+
self._primary_key = [col_name]
777+
778+
if should_be_stringified(df.index):
779+
self._string_columns.append(col_name)
780+
761781
# call map(str) for all columns identified as string columns, in
762782
# case any are not strings already
763783
for col_name in self._string_columns:
@@ -1102,7 +1122,7 @@ def _get_col_series_from_df(self, col_name, df):
11021122
if col_name in self._primary_key:
11031123
if len(self._primary_key) > 1:
11041124
key_index = self._primary_key.index(col_name)
1105-
return df.index.get_level_values(level=key_index)
1125+
return df.index.levels[key_index]
11061126
else:
11071127
return df.index
11081128
else:

qgrid/tests/test_grid.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ def test_edit_date():
7676

7777
def test_edit_multi_index_df():
7878
df_multi = create_multi_index_df()
79+
df_multi.index.set_names('first', level=0, inplace=True)
7980
view = QgridWidget(df=df_multi)
8081
old_val = df_multi.loc[('bar', 'two'), 1]
8182

@@ -493,7 +494,7 @@ def __init__(self, obj):
493494

494495

495496
def test_object_dtype():
496-
df = pd.DataFrame({'a': my_object_vals})
497+
df = pd.DataFrame({'a': my_object_vals}, index=my_object_vals)
497498
widget = QgridWidget(df=df)
498499
grid_data = json.loads(widget._df_json)['data']
499500

@@ -520,6 +521,20 @@ def test_object_dtype():
520521
assert not isinstance(grid_data[0]['a'], dict)
521522
assert not isinstance(grid_data[1]['a'], dict)
522523

524+
assert not isinstance(grid_data[0]['index'], dict)
525+
assert not isinstance(grid_data[1]['index'], dict)
526+
527+
528+
def test_index_categorical():
529+
df = pd.DataFrame({'foo': np.random.randn(3), 'future_index': [22, 13, 87]})
530+
df['future_index'] = df['future_index'].astype('category')
531+
df = df.set_index('future_index')
532+
widget = QgridWidget(df=df)
533+
grid_data = json.loads(widget._df_json)['data']
534+
535+
assert not isinstance(grid_data[0]['future_index'], dict)
536+
assert not isinstance(grid_data[1]['future_index'], dict)
537+
523538

524539
def test_object_dtype_categorical():
525540
cat_series = pd.Series(

0 commit comments

Comments
 (0)