Fixed metadata propagation in DataFrame.getitem by TomAugspurger · Pull Request #37037 · pandas-dev/pandas (original) (raw)
There's a deeper problem here. NDFrame.__finalize__ iterates through self._metadata copying items from other to new. When we have a method with a type like f(self: DataFrame, ...) -> Series, we end up trying to copy other.name to the result. That causes problem with a DataFrame with a name column:
In [10]: other = pd.DataFrame({"name": [1, 2]})
In [11]: self.finalize(other)
TypeError Traceback (most recent call last) in ----> 1 self.finalize(other)
~/Envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py in finalize(self, other, method, **kwargs) 5115 for name in self._metadata: 5116 assert isinstance(name, str) -> 5117 object.setattr(self, name, getattr(other, name, None)) 5118 return self 5119
~/Envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py in name(self, value) 493 def name(self, value: Label) -> None: 494 if not is_hashable(value): --> 495 raise TypeError("Series.name must be a hashable type") 496 object.setattr(self, "_name", value) 497
TypeError: Series.name must be a hashable type
I'll think a bit about this.