我是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
这可能吗?
答案 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)