0

我正在使用 pandas 从 SaaS REST API json 响应创建一个数据框,并点击一个小阻止程序来清理数据以进行可视化和分析。

我需要通过添加一个条件函数来调整python脚本,以说明该值是否在列表中,然后删除括号,将值分隔为新列并将新列命名为[原始列名+值列表顺序]。

在发布的类似问题中,该函数是在指定列上执行的,而我需要在数据框中的所有 1,400 多列上运行检查。基本上,excel文本到列,列标题名称是[原始列名+值列表顺序]

当前的 在此处输入图像描述

需要 在此处输入图像描述

这是来自 .json 响应的数据框创建脚本

def get_tap_dashboard():
    use_fields = ''
    for index, value in enumerate(list(WORKFLOW_FIELDS.keys())):
        if index != len(list(WORKFLOW_FIELDS.keys())) - 1:
            use_fields = use_fields + value + ','
        else:
            use_fields = use_fields + value
    dashboard_head = {'Authorization': 'Bearer {}'.format(get_tap_token()), 'Content-Type': 'application/json'}
    dashboard_url = \
        TAP_URL + "api/v1/workflows/all?pageSize={}&page=1".format(SIZE) \
        + "&advancedFilter=__WorkflowDescription__~eq~'{}'".format(WORKFLOW_NAME) \
        + "&configurationId={}".format("1128443a-f7a7-4a90-953d-c095752a97a2")
    dashboard = json.loads(requests.get(url=dashboard_url, headers=dashboard_head).text)

    all_columns = []
    for col in dashboard['Items'][0]['Columns']:
        all_columns.append(col['Name'])
    all_columns = ['ResultSetId'] + all_columns
    pd_dashboard = pd.DataFrame(columns=all_columns)

    for row in dashboard['Items']:
        add_row_values = [row['ResultSetId']]
        for col in row['Columns']:
            if col['Value'] == '-- Select One --':  # dtype issue
                add_row_values.append([''])
            else:
                add_row_values.append(col['Value'])
        add_row_df = pd.DataFrame([add_row_values], columns=all_columns)
        pd_dashboard = pd_dashboard.append(add_row_df)
    tap_dashboard = pd_dashboard
    return tap_dashboard.rename(columns=WORKFLOW_FIELDS).reset_index(drop=True)

df = get_tap_dashboard()

任何帮助将不胜感激谢谢大家!

PS - 如果在 Tableau/Tableau prep builder 中这样做更有意义,我有一个 Tableau 创建者许可证

4

1 回答 1

0

这可能是你需要的吗?

from collections import defaultdict
output = defaultdict(lambda : [])
def count(x):
    if isinstance(x,list):
        if len(x) > 1:  
            for i,item in enumerate(x):
                output[f'{item}_{i}'].append(item)
        elif len(x) == 1:
            output[f'{x[0]}_0'].append(x[0])
df['df_column_name'].apply(count)

print(pd.DataFrame.from_dict(output, orient='index').T)
于 2020-12-17T06:46:13.390 回答