|
7 | 7 | Index, |
8 | 8 | MultiIndex, |
9 | 9 | Series, |
| 10 | + concat, |
10 | 11 | ) |
11 | 12 | import pandas._testing as tm |
12 | 13 |
|
@@ -742,16 +743,67 @@ def test_equals_subclass(self): |
742 | 743 | assert df1.equals(df2) |
743 | 744 | assert df2.equals(df1) |
744 | 745 |
|
| 746 | + def test_original_property_is_preserved_when_subclassing(self): |
| 747 | + original_property = "original_property" |
| 748 | + |
| 749 | + class SubclassedSeries(Series): |
| 750 | + _metadata = [original_property] |
| 751 | + |
| 752 | + def __init__(self, data=None, original_property=None, *args, **kwargs): |
| 753 | + super().__init__(data, *args, **kwargs) |
| 754 | + self.original_property = original_property |
| 755 | + |
| 756 | + @property |
| 757 | + def _constructor(self): |
| 758 | + return SubclassedSeries |
| 759 | + |
| 760 | + @property |
| 761 | + def _constructor_expanddim(self): |
| 762 | + return SubclassedDataFrame |
| 763 | + |
| 764 | + class SubclassedDataFrame(DataFrame): |
| 765 | + _metadata = ["original_property"] |
| 766 | + |
| 767 | + def __init__(self, data=None, original_property=None, *args, **kwargs): |
| 768 | + super().__init__(data, *args, **kwargs) |
| 769 | + self.original_property = original_property |
| 770 | + |
| 771 | + @property |
| 772 | + def _constructor(self): |
| 773 | + return SubclassedDataFrame |
| 774 | + |
| 775 | + @property |
| 776 | + def _constructor_sliced(self): |
| 777 | + return SubclassedSeries |
| 778 | + |
| 779 | + data = {"key": ["foo", "bar", "baz", "foo"], "value": [1, 2, 3, 5]} |
| 780 | + df = SubclassedDataFrame(data, original_property="original_property") |
| 781 | + tm.assert_equal(df.original_property, original_property) |
| 782 | + tm.assert_equal(df[df["value"] == 1].original_property, original_property) |
| 783 | + tm.assert_equal(df.loc[df["key"] == "foo"].original_property, original_property) |
| 784 | + tm.assert_equal(df["value"].original_property, original_property) |
| 785 | + |
| 786 | + tm.assert_equal(concat([df, df]).original_property, original_property) |
| 787 | + |
| 788 | + df1 = SubclassedDataFrame( |
| 789 | + {"lkey": ["foo", "bar", "baz", "foo"], "value": [1, 2, 3, 5]}, |
| 790 | + original_property="original_property", |
| 791 | + ) |
| 792 | + df2 = SubclassedDataFrame( |
| 793 | + {"rkey": ["foo", "bar", "baz", "foo"], "value": [5, 6, 7, 8]}, |
| 794 | + original_property="original_property", |
| 795 | + ) |
| 796 | + merged_df = df1.merge(df2, left_on="lkey", right_on="rkey") |
| 797 | + tm.assert_equal(merged_df.original_property, original_property) |
| 798 | + plus = df1 + df2 |
| 799 | + tm.assert_equal(plus.original_property, original_property) |
| 800 | + |
745 | 801 |
|
746 | 802 | class MySubclassWithMetadata(DataFrame): |
747 | 803 | _metadata = ["my_metadata"] |
748 | 804 |
|
749 | | - def __init__(self, *args, **kwargs) -> None: |
750 | | - super().__init__(*args, **kwargs) |
751 | | - |
752 | | - my_metadata = kwargs.pop("my_metadata", None) |
753 | | - if args and isinstance(args[0], MySubclassWithMetadata): |
754 | | - my_metadata = args[0].my_metadata # type: ignore[has-type] |
| 805 | + def __init__(self, data=None, my_metadata=None, *args, **kwargs) -> None: |
| 806 | + super().__init__(data, *args, **kwargs) |
755 | 807 | self.my_metadata = my_metadata |
756 | 808 |
|
757 | 809 | @property |
|
0 commit comments