从嵌套字典获取熊猫数据框?

时间:2019-02-13 19:12:09

标签: python pandas dataframe

我是Python的新手,在寻找了一段时间之后,我仍然无法找到解决我问题的好方法。 我正在尝试根据词典列表创建Pandas数据框。

我的嵌套词典列表如下:

def column_check(list1,list2):
    for word in list2:
        if word in list1:
            return 1
    return 0

print(column_check(list1, list2)

我的输出应该是

{'category_1': [{'a': '151',
   'b': '116',
   'c': '86'}],
 'category_2': [{'d': '201',
   'e': '211',
   'f': '252'},
  {'d': '-1',
   'e': '-9',
   'f': '-7'}],
 'category_3': {'g': 'Valid',
   'h': None,
   'i': False,
   'j': False},
 'category_4': {'k': None,
   'l': None,
   'm': None,
   'n': None}}

我尝试过的 我可以做1、3、4类,但不知道第二类 我尝试了concat并进行了嵌套循环获取

    a     b    c    d       e       f       g      h     i      j         k    l    m     n  
 0  151   116  86   201,-1  211,-9  252,-7  valid None  False False  None None  None None

然后将其合并。 如我所说,无法整体弄清楚!

2 个答案:

答案 0 :(得分:2)

我写了一个简短的递归函数,它返回一个序列,或者如果您的字典中的一个键(例如category_2)包含多个字典的列表,则返回多个序列的串联。

def expand(x):
    if type(x) == dict:
        return pd.Series(x)
    elif type(x) == list:
        return pd.concat([expand(i) for i in x])

如果我从上面示例中粘贴的字典开始:

d = {'category_1': [{'a': '151',
   'b': '116',
   'c': '86'}],
 'category_2': [{'d': '201',
   'e': '211',
   'f': '252'},
  {'d': '-1',
   'e': '-9',
   'f': '-7'}],
 'category_3': {'g': 'Valid',
   'h': None,
   'i': False,
   'j': False},
 'category_4': {'k': None,
   'l': None,
   'm': None,
   'n': None}}

然后只需将我编写的递归方法创建的所有系列连接起来即可。

output = pd.concat([expand(value) for key, value in d.items()])

并合并所有重复的索引,以便它们的项显示在一行中并用逗号分隔。我还将该系列重塑为具有一行和几列的df:

output = pd.DataFrame(output.groupby(output.index).apply(lambda x: ','.join(x.astype(str)))).T

这将导致数据框与您所需的输出相匹配:

output

    a    b    c   d        e        f       g      h     i        j        k     l     m     n
0   151  116  86  201,-1   211,-9   252,-7  Valid  None  Invalid  Invalid  None  None  None  None

答案 1 :(得分:1)

下面的代码递归地尝试展平可以包含列表或其他字典的输入结构。当它碰到叶子时,将内容添加到平坦的字典中,然后将其转换为数据框。

flattened_dict = {}

def flatten(obj, name = ''):
    if isinstance(obj, dict):
        for key, value in obj.items():
            flatten(obj[key], key)
    elif isinstance(obj, list):
        for e in obj:
            flatten(e)
    else:
        if obj == 'null':
            obj = None
        flattened_dict[name] = [obj] 

flatten(eg1)

结果是: enter image description here

请注意,您必须将null定义为字符串。原始字典的定义是:

eg1 = { 
 "my_list": {
    "category_1": [
        {
            "a": "151",
            "b": "116",
            "c": "86"    
        }
    ],
    "category_2": [
        {
            "d": "201",
            "e": "211",
            "f": "252"
        },
        {
            "d": "-1 ",
            "e": "-9",
            "f": "-7"
        }
    ],
    "category_3": {
        "g": "Valid",
        "h": "null",
        "i": "Invalid",
        "j": "Invalid"
    },
    "category_4": {
        "k": "null",
        "l": "null",
        "m": "null",
        "n": "null"
    }
}
}