【问题标题】:How can I convert an array of class objects to a dataframe with columns in Pandas?如何将类对象数组转换为带有 Pandas 列的数据框?
【发布时间】:2019-12-03 03:48:18
【问题描述】:

使用以下类:

class Test:
    a : str
    b : str

以及以下数据框:

output = pd.DataFrame(columns=['a', 'b']

如何将 Test 类的数组或列表转换为具有匹配列的 pandas 数据框?


编辑:

让我添加一个更具体的例子:

class Test:
    a: int
    b: int

    def __init__(self, a: int, b: int):
        self.a = a
        self.b = b

l = [Test(10, 20), Test(50, 60)]

output = pd.DataFrame(l,
                  columns=['a', 'b'],
                  index=range(len(l)))

我得到的错误是:

ValueError: 传递值的形状是 (2, 1),索引意味着 (2, 2)

【问题讨论】:

  • 您是否对创建 DataFrame 的典型方式有问题?例如output = pd.DataFrame([test.a, test.b], columns=['a', 'b']),其中test = Test()
  • @PyNoob:我举了一个错误的具体例子
  • @tim:这些问题可能是相关的,但它们并不完全相同,因为另一个问题涉及列表的一部分成为标题,这里不是这种情况
  • 我不确定您打算做什么,但 Test(10, 20) 的计算结果为 <__main__.Test at 0x1db821405c0> - 一个元素;所以pd.DataFrame(l) 告诉 panda 期望一列和两行,而 columns=['a', 'b'] 意味着两列。因此出现错误。

标签: python pandas


【解决方案1】:

您可以调用vars将类的所有属性转换为dict:

class Test:
    def __init__(self, a: int, b: int):
        self.a = a
        self.b = b

tests = [Test(10, 20), Test(50, 60)]
df = pd.DataFrame([vars(t) for t in tests])

【讨论】:

  • 这行得通,谢谢!你能解释一下 [vars(t)..] 部分以及它为什么有效吗?对 python 来说有点新,但对 pandas 来说却很新(比如 4 天 :))
  • 澄清一下,我理解 vars(t),但我不理解 vars(t) for ...;我会在测试中理解 t:somelist.append(vars(t))
  • 这叫做列表理解。基本上是一个单行循环。 [vars(t) for t in tests] 将函数 vars 应用于 tests 中的每个元素。由于vars(t)返回字典,[vars(t) for ...]返回字典列表
  • 我不知道列表理解;我正在阅读它,谢谢!
【解决方案2】:

实现此目的的另一种方法是:

df = pd.DataFrame([test.__dict__ for test in tests])

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 2016-03-31
    • 2018-05-17
    • 2018-12-19
    • 2020-02-20
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多