【问题标题】:Create Dataframe with variable number of rows创建具有可变行数的数据框
【发布时间】:2021-10-05 07:42:00
【问题描述】:

我在 orden 中创建了这个函数来创建一个数据框,该数据框在每次代理调用函数时添加一个新的完整行。问题是,我希望之前创建的行保留在数据框中,这就是我使用指令追加的原因。每次调用它都会从头开始创建数据框,因此前一行被删除,我希望索引不断增加并添加新行。

以下是Python中函数的代码:

def list_active_agents(agent_id, agent_name, agent_type, activation_time):
    list = []
    list.append({
        'agent_id': agent_id,
        'agent_name': agent_name,
        'agent_type': agent_type,
        'activation_time': activation_time
    })
    columns = ['agent_id', 'agent_name', 'agent_type', 'activation_time']
    list_aa = pd.DataFrame(list, columns=columns)    
    list_aa = list_aa.drop_duplicates(keep='first')     
    return list_aa

我已尝试使用该指令; list_aa.empty,在 DataFrame 为空时进行确认,但它不能按我想要的方式工作。

帮助。

【问题讨论】:

    标签: python pandas dataframe append


    【解决方案1】:

    试试:

    li = lambda x,y,z,w :  {
            'agent_id': x,
            'agent_name': y,
            'agent_type': z,
            'activation_time': w
        }
    columns = ['agent_id', 'agent_name', 'agent_type', 'activation_time']
    list_aa = pd.DataFrame([], columns=columns)
    def list_active_agents(agent_id, agent_name, agent_type, activation_time):
        global list_aa
        list_aa = list_aa.append(li(agent_id, agent_name, agent_type, activation_time), ignore_index=True)
        list_aa = list_aa.drop_duplicates(keep='first')     
        return list_aa
    

    list_active_agents(1, 'a', 't', 10)
    list_active_agents(1, 'b', 't', 10)
    

        agent_id    agent_name  agent_type  activation_time
    0   1           a           t           10
    1   1           b           t           10
    

    list_active_agents(1, 'a', 't', 10)
    list_active_agents(1, 'a', 't', 10)
    

        agent_id    agent_name  agent_type  activation_time
    0   1           a           t           10
    

    【讨论】:

      【解决方案2】:

      首先,使用关键字list作为变量是不好的做法,它已经在python中定义了。我将在下面的代码中使用my_list。我看到的另一个问题是每次调用函数时都重新定义了一个空列表,所以你丢失了前面的行。我将使用前一个数据帧作为函数的输入并附加到它。第一次运行该函数时,您可以在不使用参数dataframe 的情况下运行它,该函数将自行创建它。您还可以在函数的开头添加一些安全线,在这里您可以测试传递给 dataframe 的值是 None 还是 pandas dataframe,以确保没有 list 或 dict 等被错误传递。

      请注意,当您将字典列表传递给 DataFrame 时,您无需显式指定列名,pandas 会自动使用字典的键。

      如果您不想将数据框作为参数添加到函数中,另一种可能性是将其定义为全局。

      import pandas as pd
      
      def list_active_agents(agent_id, agent_name, agent_type, activation_time, dataframe=None):
          my_list = [{
              'agent_id': agent_id,
              'agent_name': agent_name,
              'agent_type': agent_type,
              'activation_time': activation_time
          }]
          if dataframe == None:
              dataframe_result = pd.DataFrame(my_list)
          else:
              dataframe_result = dataframe.append(my_list, ignore_index=True)
          dataframe_result = dataframe_result.drop_duplicates(keep='first')     
      return dataframe_result
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-25
        • 2021-07-02
        • 2019-03-20
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多