spyder-ide / spyder

Official repository for Spyder - The Scientific Python Development Environment
https://www.spyder-ide.org
MIT License
8.33k stars 1.61k forks source link

Not Aable to check Dataframe #20073

Open umangretailio opened 1 year ago

umangretailio commented 1 year ago

Description

What steps will reproduce the problem?

  1. Ran the script 2.Tried opening variable - dataframe

Traceback

  File "pandas/_libs/hashtable_class_helper.pxi", line 4588, in pandas._libs.hashtable.PyObjectHashTable.map_locations
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py", line 1785, in __hash__
    raise TypeError(
TypeError: 'Series' objects are mutable, thus they cannot be hashed
Exception ignored in: 'pandas._libs.index.IndexEngine._call_map_locations'
Traceback (most recent call last):
  File "pandas/_libs/hashtable_class_helper.pxi", line 4588, in pandas._libs.hashtable.PyObjectHashTable.map_locations
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py", line 1785, in __hash__
    raise TypeError(
TypeError: 'Series' objects are mutable, thus they cannot be hashed
Traceback (most recent call last):
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/spyder/plugins/variableexplorer/widgets/collectionsdelegate.py", line 199, in createEditor
    if not editor.setup_and_check(value, title=key):
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/spyder/plugins/variableexplorer/widgets/dataframeeditor.py", line 952, in setup_and_check
    self.dataModel = DataFrameModel(data, parent=self)
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/spyder/plugins/variableexplorer/widgets/dataframeeditor.py", line 139, in __init__
    self.max_min_col_update()
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/spyder/plugins/variableexplorer/widgets/dataframeeditor.py", line 248, in max_min_col_update
    for dummy, col in self.df.iteritems():
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py", line 1024, in iteritems
    yield from self.items()
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py", line 1020, in items
    yield k, self._ixs(i, axis=1)
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py", line 2965, in _ixs
    result = self._box_col_values(values, i)
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py", line 3314, in _box_col_values
    return klass(values, index=self.index, name=name, fastpath=True)
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/series.py", line 369, in __init__
    self.name = name
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py", line 5487, in __setattr__
    object.__setattr__(self, name, value)
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/series.py", line 540, in name
    validate_all_hashable(value, error_name=f"{type(self).__name__}.name")
  File "/Users/umangraman/opt/anaconda3/lib/python3.8/site-packages/pandas/core/dtypes/common.py", line 1764, in validate_all_hashable
    raise TypeError(f"{error_name} must be a hashable type")
TypeError: Series.name must be a hashable type

Versions

Dependencies


# Mandatory:
applaunchservices >=0.1.7       :  0.2.1 (OK)
atomicwrites >=1.2.0            :  1.4.0 (OK)
chardet >=2.0.0                 :  4.0.0 (OK)
cloudpickle >=0.5.0             :  1.6.0 (OK)
diff_match_patch >=20181111     :  20200713 (OK)
intervaltree >=3.0.2            :  3.1.0 (OK)
IPython >=7.6.0                 :  7.22.0 (OK)
jedi =0.17.2                    :  0.17.2 (OK)
jsonschema >=3.2.0              :  3.2.0 (OK)
keyring >=17.0.0                :  22.3.0 (OK)
nbconvert >=4.0                 :  6.0.7 (OK)
numpydoc >=0.6.0                :  1.1.0 (OK)
parso =0.7.0                    :  0.7.0 (OK)
pexpect >=4.4.0                 :  4.8.0 (OK)
pickleshare >=0.4               :  0.7.5 (OK)
psutil >=5.3                    :  5.8.0 (OK)
pygments >=2.0                  :  2.8.1 (OK)
pylint >=1.0                    :  2.7.4 (OK)
pyls >=0.36.2;<1.0.0            :  0.36.2 (OK)
pyls_black >=0.4.6              :  0.4.6 (OK)
pyls_spyder >=0.3.2             :  0.3.2 (OK)
qdarkstyle >=2.8;<3.0           :  2.8.1 (OK)
qtawesome >=0.5.7               :  1.0.2 (OK)
qtconsole >=5.0.3               :  5.0.3 (OK)
qtpy >=1.5.0                    :  1.9.0 (OK)
rtree >=0.8.3                   :  0.9.7 (OK)
setuptools >=39.0.0             :  52.0.0.post20210125 (OK)
sphinx >=0.6.6                  :  4.0.1 (OK)
spyder_kernels >=1.10.2;<1.11.0 :  1.10.2 (OK)
textdistance >=4.2.0            :  4.2.1 (OK)
three_merge >=0.1.1             :  0.1.1 (OK)
watchdog >=0.10.3;<2.0.0        :  1.0.2 (OK)
zmq >=17                        :  20.0.0 (OK)

# Optional:
cython >=0.21                   :  0.29.23 (OK)
matplotlib >=2.0.0              :  3.3.4 (OK)
numpy >=1.7                     :  1.20.1 (OK)
pandas >=1.1.1                  :  1.2.4 (OK)
scipy >=0.17.0                  :  1.6.2 (OK)
sympy >=0.7.3                   :  1.8 (OK)
maurerle commented 1 year ago

@umangretailio what is the script you ran? Did you click on the dataframe in the variable explorer?

A way to provoke something similar is to run:

import pandas as pd
df = pd.DataFrame([1,2,3], [1,2,3])
df.columns = [{'test': 'x'}]

and then click on the df in the variable explorer. Of course it doesn't like dicts as column names - which is generally a very bad idea.

Still Spyder should handle that case somehow, instead of creating an internal error.

Internally, we run something like: for x,y in df.items(): print(x,y) which already produces an error - so we otherwise might just cath the error and provide valuable feedback to the user as the issue is more a pandas thing

maurerle commented 1 year ago

Of course one can fix this in max_min_col_update and catch the error and return len(self.df.columns) * [None]

Yet this still has a lot of errors when clicking on a column, typing df in the IPython (which is a IPython format error) and so on.. So I would disregard using any Dataframes with unhashable column names

ccordoba12 commented 1 year ago

Still Spyder should handle that case somehow, instead of creating an internal error.

I agree @maurerle.

Of course one can fix this in max_min_col_update and catch the error and return len(self.df.columns) * [None]

What if we show a QMessabeBox saying that Spyder can't display DataFrames with unhashable column names? I think that would be the best we could do on the Spyder side (of course, there's nothing we can do about the IPython issues you mentioned).