【问题标题】:Converting Object Attributes to Dataframe将对象属性转换为数据框
【发布时间】:2022-01-15 08:24:35
【问题描述】:

我正在尝试从对象列表中获取属性并使用结果创建一个数据框...以下过程在大多数情况下都有效,但它似乎效率低下且不合适。有没有另一种不需要这么多代码行的方法?

下面,我正在为每一列创建空白列表,从对象中获取一个属性,将其附加到适当的列表中,创建一个空白数据框,并将列表映射到列。我希望以某种方式创建一个循环或使用字典或一次抓取多个列或其他东西

对象格式:https://developers.asana.com/docs/tasks

gids = []
task_names = []
custom_fields = [] #status, workstream, subworkstream
custom_values = []
types = []
due_dates = []
portfolios = []
projects = []
sections = []
section_dates = []
assignees = []
parents = []
releases = []
tags = []
task_list = []

tasks = client.tasks.get_tasks_for_project(project, {'param': 'value', 'param': 'value'}, opt_pretty=True)
for x in tasks:
    task_list.append(x['gid'])

for task in task_list:
    t = client.tasks.get_task(task, {'param': 'value', 'param': 'value'}, opt_pretty=True)
    try:
        gids.append(t['gid'])
        task_names.append(t['name'])
        types.append(t['resource_subtype'])
        due_dates.append(t['due_on'])
        parents.append(t['parent']['name'])
    except:
        gids.append('None')
        task_names.append('None')
        types.append('None')
        due_dates.append('None')
        parents.append('None')
        pass

task_df = pd.DataFrame()
task_df['ID'] = gids
task_df['Task'] = task_names
task_df['Type'] = types
task_df['Due Date'] = due_dates
task_df['Parent'] = parents

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    鉴于你的例子,并且没有测试的好处,因为我没有你用于任务的库,我相信你应该重新考虑你的方法如下:

    我将创建两个字典,而不是所有单独的赋值语句:第一个名为 attrib_dict 将任务属性映射到 df 列标题。第二个收集任务的属性值,如果不存在属性,则在该位置放置一个 NaN 值。

    鉴于这两个概念,这就是我将如何完成这项任务>

    import pandas as pd
    import numpy as np  
    
    #Return a Formatted Dataframe from a list of tasks
    def buildDF(tasks):
        
        # maps task attribute to df column head
        atrib_dict = {'guid': 'ID', 'name': 'Task', 'resource_subtype': 'Type', 'due_on': 'Due Date', 'parent':' Parent'}    
        
        # Dictionary to hold task data according to desired DF format
        data_dict = {'ID':[], 'Task':[], 'Type':[], 'Due Date':[], 'Parent':[], '':[], }
        
        # Fetch the tasks to operate upon
    
        atrib_keys = atrib.dict/keys()
        for t in tasks:
            for atrib in atrib_keys:
                try:
                    val = t[atrib]
                except:
                    val = np.nan
                data_dict[atrib_dict[atrib]].append(val)
        return pd.DataFrame(data_dict)       
    

    然后我会调用 buildDf 函数如下:

    buildDF(client.tasks.get_tasks_for_project(project, {'param': 'value', 'param': 'value'}, opt_pretty=True))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2014-07-05
      • 2014-11-12
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多