【问题标题】:Create a DataFrame with data from a class使用类中的数据创建 DataFrame
【发布时间】:2022-12-03 14:04:05
【问题描述】:

我想创建一个 DataFrame,我想从一个类中导入数据。我的意思是,我输入 t1 = Transaction("20221128", "C1", 14) 并且我想要一个 DataFrame 来显示如下数据:

  1. 第 1 列:日期
  2. 第 2 栏:概念
  3. 第 3 列:金额

    我要实现它的代码是:

    class Transactions:
    
        num_of_transactions = 0
        amount = 0
    
        def __init__(self, date, concept, amount):
            self.date = date
            self.concept = concept
            self.amount = amount
            Transaction.add_transaction()
            Transaction.add_money(self)
    
        @classmethod
        def number_of_transactions(cls):
            return cls.num_of_transactions
    
        @classmethod
        def add_transaction(cls):
            cls.num_of_transactions += 1
    
        @classmethod
        def amount_of_money(cls):
            return cls.amount
    
        @classmethod
        def add_money(cls, self):
            cls.amount += self.amount
    
    t1 = Transaction("20221128", "C1", 14)
    t2 = Transaction("20221129", "C2", 30)
    t3 = Transaction("20221130", "3", 14)
    

    我试过了:

    def DataFrame(self):
        df = pd.DataFrame(self.date self.concept, self.amount)
    

    但是查看 pandas 文档,我发现这不是一种有效的方法。

    有什么帮助吗?谢谢!

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    为了创建一个新的数据框,您必须提供行和列的名称。

    您必须按以下方式更改代码:

    def DataFrame(self):
        df = pd.DataFrame(data=[[self.date, self.concept, self.amount]], columns=['Date','Concept','Amount'])
    

    【讨论】:

      【解决方案2】:

      您可以通过首先创建一个字典列表,从事务对象列表创建一个 DataFrame,其中每个字典代表 DataFrame 中的一行,并具有与列相对应的键。这是一种方法:

      import pandas as pd
      
      # Create a list of Transaction objects
      transactions = [t1, t2, t3]
      
      # Create a list of dictionaries, where each dictionary represents a row in the DataFrame
      data = []
      for t in transactions:
          row = {"Date": t.date, "Concept": t.concept, "Amount": t.amount}
          data.append(row)
      
      # Create a DataFrame from the list of dictionaries, specifying the columns in the desired order
      df = pd.DataFrame(data, columns=["Date", "Concept", "Amount"])
      
      # Print the DataFrame
      print(df)
      

      这应该会产生一个如下所示的 DataFrame:

      |    | Date     | Concept   | Amount   |
      |---:|:---------|:----------|:---------|
      |  0 | 20221128 | C1        |       14 |
      |  1 | 20221129 | C2        |       30 |
      |  2 | 20221130 | 3         |       14 |
      

      上面的代码假定 Transaction 类的定义如您在问题中所示,使用 __init__ 方法以及您包含的类变量和方法。请注意,我已将类定义中的Transaction替换为Transactions以匹配类名,并且我还将add_money方法的self参数更改为transaction,以避免与self实例方法的参数。 DataFrame 函数不是类定义的一部分,而是被定义为一个单独的函数,它将 Transaction 对象列表作为其参数。

      您还可以向 Transactions 类添加一个类方法,该方法返回一个表示该类所有实例的 DataFrame。为此,您可以添加一个类变量 transactions_list 来跟踪该类的所有实例,以及一个类方法 to_dataframetransactions_list 转换为 DataFrame。

      这是实现它的一种方法:

      import pandas as pd
      
      class Transactions:
      
          num_of_transactions = 0
          amount = 0
          transactions_list = []  # Class variable to store all instances of the class
      
          def __init__(self, date, concept, amount):
              self.date = date
              self.concept = concept
              self.amount = amount
              # Add the instance to the transactions_list
              self.transactions_list.append(self)
              Transactions.add_transaction()
              Transactions.add_money(self)
      
          @classmethod
          def number_of_transactions(cls):
              return cls.num_of_transactions
      
          @classmethod
          def add_transaction(cls):
              cls.num_of_transactions += 1
      
          @classmethod
          def amount_of_money(cls):
              return cls.amount
      
          @classmethod
          def add_money(cls, self):
              cls.amount += self.amount
      
          @classmethod
          def to_dataframe(cls):
              # Create a list of dictionaries representing each transaction
              transactions_list = [{'Date': t.date, 'Concept': t.concept, 'Amount': t.amount} for t in cls.transactions_list]
      
              # Create a DataFrame from the list of dictionaries
              df = pd.DataFrame(transactions_list)
      
              return df
      
      # Create some transactions
      t1 = Transactions("20221128", "C1", 14)
      t2 = Transactions("20221129", "C2", 30)
      t3 = Transactions("20221130", "3", 14)
      

      然后,您可以调用类方法to_dataframe 来获取表示所有交易的 DataFrame:

      df = Transactions.to_dataframe()
      

      这应该创建一个 DataFrame df,其中包含列 'Date''Concept''Amount' 以及对应于每个事务的行。

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2020-01-14
        • 2019-10-17
        • 2020-06-29
        • 2018-12-30
        • 2019-11-23
        • 1970-01-01
        • 2017-05-17
        • 1970-01-01
        相关资源
        最近更新 更多