【问题标题】:When attempting to pass a dictionary to a pandas dataframe, how to resolve: ValueError: If using all scalar values, you must pass an index尝试将字典传递给熊猫数据框时,如何解决: ValueError: If using all scalar values, you must pass an index
【发布时间】:2020-08-28 20:29:59
【问题描述】:

我正在从需要写入 SQL 表的 REST API 中提取数据。 我的方法是将 JSON 数据添加到字典中,将字典传递给数据框并将数据框写入 SQL。

balances() 函数传递给数据框时出现以下错误:

ValueError: If using all scalar values, you must pass an index

我做错了什么?也请随时就我的代码结构提供反馈,我觉得有更简单的方法可以用更少的代码提取数据。

def balances():   
    for b in get_balances["balances"]:
        result = {}
        result["employeeID"] = int(b.get("employeeID"))
        result["resourceID"] = int(b.get("resourceID"))
        result["resourceType"] = int(b.get("resourceType"))
        if b.get("startDate") is None:
            pass
        else:
            result["startDate"] = b.get("startDate").split("#")[0]
        if b.get("endDate") is None:
            pass
        else:
            result["endDate"] = b.get("endDate").split("#")[0]
        result["minutesLeft"] = b.get("minutesLeft")
        result["minutestoTake"] = b.get("minutestoTake")
        result["minutesTaken"] = b.get("minutesTaken")
        result["minutesTakenPast"] = b.get("minutesTakenPast")
        result["minutestakenFuture"] = b.get("minutesTakenFuture")
        result["periodMinutesToTake"] = b.get("periodMinutesToTake")
        result["periodMinutesTaken"] = b.get("periodMinutesTaken")
        for h in b.get("history"):
            if h.get("planningDate") is None:
                pass
            else:
                result["planningDate"] = h.get("planningDate").split("#")[0]
            result["resourceTypeHistory"] = h.get("resourceType")
            result["resourceIDHistory"] = h.get("resourceID")
            result["minutes"] = h.get("minutes")
            result["balanceMinutes"] = h.get("balanceMinutes")
            result["remark"] = h.get("remark")
            yield result

print(pd.DataFrame(balances()))

#ValueError: If using all scalar values, you must pass an index

2行的样本输出数据:

{'employeeID': 569, 'resourceID': 230, 'resourceType': 144, 'startDate': '2020-01-01', 'endDate': '2020-12-31', 'minutesLeft': 11281, 'minutestoTake': None, 'minutesTaken': 960, 'minutesTakenPast': 0, 'minutestakenFuture': -960, 'periodMinutesToTake': 0, 'periodMinutesTaken': 0, 'planningDate': '2020-01-01', 'resourceTypeHistory': 15, 'resourceIDHistory': 3, 'minutes': 12000, 'balanceMinutes': 12000, 'remark': ''}
{'employeeID': 877, 'resourceID': 33, 'resourceType': 125, 'startDate': '2020-01-01', 'endDate': '2020-12-31', 'minutesLeft': 11281, 'minutestoTake': None, 'minutesTaken': 960, 'minutesTakenPast': 0, 'minutestakenFuture': -960, 'periodMinutesToTake': 0, 'periodMinutesTaken': 0, 'planningDate': '2020-06-05', 'resourceTypeHistory': 2, 'resourceIDHistory': 3, 'minutes': -480, 'balanceMinutes': 11281, 'remark': ''}

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    为您的示例 JSON 使用 json_normalize

    import pandas as pd
    import json
    
    with open('1.json', 'r+') as f:
        data = json.load(f)
    
    df = pd.json_normalize(data)
    print(df)
    
       employeeID  resourceID  resourceType   startDate     endDate  ...  resourceTypeHistory resourceIDHistory  minutes  balanceMinutes  remark
    0         569         230           144  2020-01-01  2020-12-31  ...                   15                 3    12000           12000
    1         877          33           125  2020-01-01  2020-12-31  ...                    2                 3     -480           11281
    

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 2018-04-20
      • 2021-04-01
      • 2020-11-19
      • 2020-12-20
      • 2021-03-19
      • 2021-07-14
      • 2022-01-16
      • 2015-01-13
      相关资源
      最近更新 更多