反熊猫json_normalize

问题描述 投票:2回答:3

我刚刚发现了json_normalize函数,该函数在获取JSON对象并给我一个pandas Dataframe时效果很好。现在我想要反向操作,它采用相同的Dataframe并给我一个json(或类似json的字典,我可以很容易地转向json),其结构与原始json相同。

这是一个例子:https://hackersandslackers.com/json-into-pandas-dataframes/

他们采用JSON对象(或类似JSON的python字典)并将其转换为数据帧,但我现在想要将该数据帧转换为类似JSON的字典(以后转储到json文件)。

json python-3.x pandas normalize
3个回答
2
投票

我用几个函数实现了它

def set_for_keys(my_dict, key_arr, val):
    """
    Set val at path in my_dict defined by the string (or serializable object) array key_arr
    """
    current = my_dict
    for i in range(len(key_arr)):
        key = key_arr[i]
        if key not in current:
            if i==len(key_arr)-1:
                current[key] = val
            else:
                current[key] = {}
        else:
            if type(current[key]) is not dict:
                print("Given dictionary is not compatible with key structure requested")
                raise ValueError("Dictionary key already occupied")

        current = current[key]

    return my_dict

def to_formatted_json(df, sep="."):
    result = []
    for _, row in df.iterrows():
        parsed_row = {}
        for idx, val in row.iteritems():
            keys = idx.split(sep)
            parsed_row = set_for_keys(parsed_row, keys, val)

        result.append(parsed_row)
    return result


#Where df was parsed from json-dict using json_normalize
to_formatted_json(df, sep=".")

1
投票
df.to_json(path)

要么

df.to_dict()

0
投票

让我投入两分钱

在向后转换之后,您可能需要从生成的jsons中删除空列,因此,我检查了val!= np.nan。但你不能直接这样做,而是你需要检查val == val或不,因为np.nan!=本身。我的版本:

def to_formatted_json(df, sep="."):
result = []
for _, row in df.iterrows():
    parsed_row = {}
    for idx, val in row.iteritems():
        if val == val:
            keys = idx.split(sep)
            parsed_row = set_for_keys(parsed_row, keys, val)

    result.append(parsed_row)
return result
© www.soinside.com 2019 - 2024. All rights reserved.