簡體   English   中英

如何確保在 class 中,從一個數據框中刪除行會刪除另一個數據框中的一行

[英]How to ensure within a class, deleting row from one data frame deletes a row in another data frame

我的問題是 class 具有多個(比如說 2 個)數據幀,我想確保從一個數據幀中刪除一行也會從另一個數據幀中刪除同一行。 所以基本上它們應該始終保持同步。

例如

class C:
    def __init__(self, df1, df2):
        self.df1 = df1
        self.df2 = df2

del C.df1[0] # -> means C.df2[0] will also be deleted
C.df1 = C.df1[0:10] # slicing also means df2 will be sliced 

回答你的問題

一般來說,您正在尋找的是類似於setter的東西,它是 class 上的一種方法,只要設置了某個屬性,它就會運行一些代碼。 在 python 中,有幾種方法可以在 class 上編寫設置器。 我建議您閱讀類似https://www.python-course.eu/python3_properties.php

但是,這僅適用於設置屬性,例如

instance.df1 = some_df

要檢查 dataframe 列的更改,您可以使用觀察者模式go 並將您的 df 屬性包裝到觀察者 class 中。 演示原理:

from typing import Any, Callable, Mapping


class ObservedAttribute:
    def __init__(
        self, value: Mapping, callback: Callable[[Any, Any], None]
    ) -> None:
        self._value = value
        self.callback = callback

    def __getimen__(self, key: Any) -> None:
        return self._value.__getitem__(key)

    def __setitem__(self, key: Any, value: Any) -> None:
        self._value.__setitem__(key, value)
        self.callback(key, value)


class ObservedClass:
    def __init__(self, attr_1: Mapping, attr_2: Mapping) -> None:
        self._attr_1 = ObservedAttribute(attr_1, self.attr_1_observer)
        self.attr_2 = attr_2

    def attr_1_observer(self, key, value):
        self.attr_2.__setitem__(key, value)

    @property
    def attr_1(self):
        return self._attr_1


instance = ObservedClass({"a": 1}, {"a": 2})
instance.attr_1["a"] = "newValue"

print(instance.attr_2["a"])  # "newValue"

解決您的問題

話雖如此,我強烈認為您的實際問題出在其他地方。 您保持兩個數據幀同步的想法聽起來很像反模式。 除其他外,您的方法會出現以下問題:

  1. 誰確保數據幀具有相同的長度? 這不在您的代碼中。
  2. 如果 df 屬性之一被完全覆蓋,應該發生什么? 你想如何控制這個?
  3. 如果您在構建實例時不確定數據幀是否相同,這意味着無論如何,您在 df1 和 df2 之間不具有完整性。 如果事實上你可以保證它們總是相同的,那么你實際上不需要兩個副本飛來飛去。

所以我建議你重新考慮你的整個方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM