从“嵌套” DataFrame到嵌套Json

时间:2019-03-29 11:38:54

标签: python json pandas

我有一个DataFrame,其中包含通过在嵌套JSON中使用Panda的函数“ json_normalize”制成的伪嵌套列(即,名称)。我想从具有嵌套值的DataFrame中构建一个JSON。

这是我正在尝试做的一个例子。请注意,这只是一个使它更易于理解的示例,它不完全是我的用例。我的用例要求Pandas进行一些“大量”的Dataframe转换。

DataFrame之类的

   id name.first name.last
0   1     Coleen      Volk
1   2       Mose    Regner

我想要的JSON是:

[{'id': 1,
 'name': {'first': 'Coleen',
         'last': 'Volk'}},
{'id': 2, 
'name': {'first': 'Mose', 
         'last': 'Regner'}}]

-要复制的简单代码:

data = [{'id': 1, 'name': {'first': 'Coleen', 'last': 'Volk', 'nickname': 'Perico'}},
    {'id': 2, 'name': {'first': 'Mose', 'last': 'Regner', 'nickname': 'Palotes'}}]

df = pd.io.json.json_normalize(data)
#some transormations using Pandas
df = df.drop(columns=['name.nickname'])

#Now I want to build the JSON

1 个答案:

答案 0 :(得分:1)

根据{Pars T的the function provided here

import pandas as pd

data = [{'id': 1, 'name': {'first': 'Coleen', 'last': 'Volk', 'nickname': 'Perico'}},
    {'id': 2, 'name': {'first': 'Mose', 'last': 'Regner', 'nickname': 'Palotes'}}]

df = pd.io.json.json_normalize(data)
#some transormations using Pandas
df = df.drop(columns=['name.nickname'])





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=".")

输出:

Out[9]: 
[{'id': 1, 'name': {'first': 'Coleen', 'last': 'Volk'}},
 {'id': 2, 'name': {'first': 'Mose', 'last': 'Regner'}}]