【问题标题】:iterating through variables within an object in python在python中遍历对象中的变量
【发布时间】:2018-11-21 22:39:16
【问题描述】:

好的,这可能是一个非常愚蠢的问题,但是......

我有一个对象 x,其中包含许多 pandas 数据帧(df1df2df3 以供争论)

当程序完成运行后,我想将这些数据帧中的每一个导出到它自己的 csv 文件中。目前,我在x 中有一个函数,如下所示:

def export(self, path):
    self.df1.to_csv(path+"_df1.csv")
    self.df2.to_csv(path+"_df2.csv")
    self.df3.to_csv(path+"_df3.csv")

它有效(我可以使用x.export(somepath),但我一直不得不更改它,因为我想保留在对象中的数据会发生变化。有人可以告诉我是否有一种方法可以简单地迭代所有变量在一个对象内(它们都是相同的格式)并(在这种情况下)将它们全部转储到各自的 .csv 文件中?

谢谢

【问题讨论】:

  • 有一个实例变量dataframes,它是一个保存数据帧的列表?
  • 难道我不必手动将所有不同的变量添加到此列表中吗? - 这就是我试图避免的。示例中我只使用了三个,但原代码中还有很多!
  • 在某一时刻,您必须指定要导出的数据框。不妨将它们列在一个列表中。我有一种感觉,您正在尝试做一些奇怪的事情,而您的问题缺少信息。
  • @Will 然后您可以在__init__ 中执行self.dataframes = [pd.DataFrame(), pd.DataFrame(), ...] 而不是访问instance.df1,而是使用instance.dataframes[0]。 (当然,您也可以从该列表中选择popappend。)
  • @Will 当然可以使用字典。不要害怕尝试。

标签: python python-3.x pandas oop


【解决方案1】:

您可以遍历__dict__ 以检索属性名称和数据框对象。您可以检查对象类型以避免在不是数据框的东西上调用.to_csv

这里是一些示例代码,用于对解决方案进行原型设计。

class A():
    def __init__(self):
        self.x = pd.DataFrame([[1,2],[3,4]])
        self.y = pd.DataFrame([[5,6],[7,8]])

    def export(self, path):
        for k, v in self.__dict__.items()
            if isintance(v, pd.DataFrame):
                v.to_csv('{}_{}.csv'.format(path, k)

a = A()
a.export('dataframes')

【讨论】:

  • 我投了反对票,因为在我看来,这是可怕且低效的 Python。保持一个包含数据帧的可迭代对象。在__init__ 中创建它。
  • @timgeb 低效也没关系,相差不到毫秒。
  • @timgeb,给我们一个有效的方法
  • @timgeb,很酷,同意拥有所有数据帧的列表。
  • @cal97g 首先,你不知道 OP 的对象的__dict__ 可以有多大,所以你的估计时间纯属猜测。其次,违反了可读性和鸭子类型的原则。我们可以在这里避免显式的实例检查,同时让代码更快而不需要任何成本——所以我们应该这样做。
猜你喜欢
  • 2016-02-09
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2018-10-07
  • 2018-10-18
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多