python - 如何将字典展开成 pandas DataFrame 以获取更大的字典?
问题描述
考虑以下 python3.x 中的字典字典
dict1 = {4: {4:25, 5:39, 3:42}, 5:{24:94, 252:49, 25:4, 55:923}}
我想把它展开成一个熊猫数据框。似乎有两种选择:
df1 = pd.DataFrame.from_dict(dict1, orient='columns')
print(df1)
4 5
3 42.0 NaN
4 25.0 NaN
5 39.0 NaN
24 NaN 94.0
25 NaN 4.0
55 NaN 923.0
252 NaN 49.0
其中列是主字典键4
和“5”,行索引是子字典键,值是子字典值。
另一种选择是
df2 = pd.DataFrame.from_dict(dict1, orient='index')
print(df2)
4 5 3 24 252 25 55
4 25.0 39.0 42.0 NaN NaN NaN NaN
5 NaN NaN NaN 94.0 49.0 4.0 923.0
其中列是内部“子字典”的键,行索引是主字典的键,值是子字典的键。
是否有一种标准方法可以让我们按如下方式展开 python 字典?
key inner_key values
4 3 42
4 4 25
4 5 39
5 24 94
5 25 4
5 55 923
5 252 49
最好不要在使用后操作 DataFrame from_dict()
,因为对于更大的 python 字典,这可能会变得非常占用内存。
解决方案
列表理解
列表理解应该相当有效:
dict1 = {4: {4:25, 5:39, 3:42}, 5: {24:94, 252:49, 25:4, 55:923}}
cols = ['key', 'inner_key', 'values']
df = pd.DataFrame([[k1, k2, v2] for k1, v1 in dict1.items() for k2, v2 in v1.items()],
columns=cols).sort_values(cols)
print(df)
key inner_key values
2 4 3 42
0 4 4 25
1 4 5 39
3 5 24 94
5 5 25 4
6 5 55 923
4 5 252 49
pd.melt
+dropna
如果您不介意从 开始工作df1
,您可以通过 unpivot 您的数据框pd.melt
,然后删除带有 null 的行value
。
df1 = df1.reset_index()
res = pd.melt(df1, id_vars='index', value_vars=[4, 5])\
.dropna(subset=['value']).astype(int)
print(res)
index variable value
0 3 4 42
1 4 4 25
2 5 4 39
10 24 5 94
11 25 5 4
12 55 5 923
13 252 5 49
推荐阅读
- html - Html 固定布局
- lucene - 有没有关于 Lucene BM25Similarity 的解释?
- hadoop - 运行 NiFi 所需的 Hadoop 配置是什么?
- angular - 为什么 Angular 中的子组件应该通过 NgModule 注册?封装呢?
- excel - Excel - VBA:日期格式数字(yyyy-mm-dd)不适用于所有值
- java - 是否有在基于 Selenium 的测试自动化框架中创建和实现接口的示例?
- python-3.x - 将列转换为多索引列
- delphi - CEF3 发送鼠标点击
- javascript - 如何从 React 中的 int 像素值数组渲染图像?
- node.js - 无法在 CentOS 7 上安装节点画布