从嵌套字典列表中获取pandas数据帧

时间:2017-01-30 22:59:05

标签: python list pandas dictionary dataframe

我是Python的新手,所以这可能非常简单,但在找了一段时间之后,我找不到能解决问题的好方法。我正在尝试从字典列表中创建一个Pandas数据帧。

我的嵌套词典列表如下:

my_list = [{0: {'a': '23', 'b': '15', 'c': '5', 'd': '-1'}, 
            1: {'a': '5', 'b': '6', 'c': '7', 'd': '9'}, 
            2: {'a': '9', 'b': '15', 'c': '5', 'd': '7'}}, 
           {0: {'a': '5', 'b': '249', 'c': '92', 'd': '-4'}, 
            1: {'a': '51', 'b': '5', 'c': '34', 'd': '1'}, 
            2: {'a': '3', 'b': '8', 'c': '3', 'd': '11'}}]

因此主要词典中的每个键都有3个值。

使用data = pd.DataFrame(my_list)将这些内容放入数据框中会返回一些不可用的内容,因为每个单元格都包含有关a,b,c和d的信息。

我希望最终得到一个如下所示的数据框:

 name| a  | b  | c | d 
0    | 23 | 15 | 5 | -1 
1    | 5  | 6  | 7 |  9 
2    | 9  | 15 | 5 |  7 
0    | 5  |249 | 92| -4 
1    |51  | 5  | 34|  1 
2    | 3  | 8  | 3 | 11 

这可能吗?

4 个答案:

答案 0 :(得分:4)

易:

pd.concat([pd.DataFrame(l) for l in my_list],axis=1).T

答案 1 :(得分:3)

另一种解决方案:

from itertools import chain
pd.DataFrame.from_items(list(chain.from_iterable(d.iteritems() for d in my_list))).T

在我的实验中,这比使用pd.concat更快(特别是当“子数据帧”的数量很大时),但代价是更加冗长。

答案 2 :(得分:1)

您可以将字典列表添加到DataFrame构造函数中:

try (PreparedStatement queryPS = myConnection.prepareStatement(
        "select * from donor where username = ?");
     PreparedStatement updatePS = myConnection.prepareStatement(
        "update bank set bloodtype = ? where name = ?");) {

    queryPS.setString(1, username);
    ResultSet rs = queryPS.executeQuery();
    if (rs.next()) {
        String type = rs.getString("bloodtype");
        System.out.println("the user's blood type is: " + type);
        updatePS.setString(1, type);
        updatePS.setString(2, username);
        updatePS.executeUpdate();
    }
} catch (SQLException e) {
    // handle it
}

这需要相对较新版本的Python才能使用type。它只是以下的简写:

In [4]: pd.DataFrame.from_records([{'name': k, **v} for d in my_list for k,v in d.items()])
Out[4]:
    a    b   c   d  name
0  23   15   5  -1     0
1   5    6   7   9     1
2   9   15   5   7     2
3   5  249  92  -4     0
4  51    5  34   1     1
5   3    8   3  11     2

In [5]: df = pd.DataFrame.from_records([{'name': k, **v} for d in my_list for k,v in d.items()])

In [6]: df.set_index('name',inplace=True)

In [7]: df
Out[7]:
       a    b   c   d
name
0     23   15   5  -1
1      5    6   7   9
2      9   15   5   7
0      5  249  92  -4
1     51    5  34   1
2      3    8   3  11

答案 3 :(得分:0)

从熊猫导入数据帧

def flat_dict(data: dict, prefix=''): 结果 = dict()

for key in data:
    
    if len(prefix):
        field = prefix + '_' + key
    else:
        field = key
        
    if isinstance(data[key], dict):
        result.update(
            flat_dict(data[key], key)
        )
    else:
        result[field] = data[key]

return result

refactor_data = map(lambda x: flat_dict(x), data)

df = DataFrame(refactor_data)