python - 从嵌套字典中获取熊猫数据框?
问题描述
我是 Python 新手,找了一段时间后,我还没有找到一个很好的答案来解决我的问题。我正在尝试从字典列表中创建一个 Pandas 数据框。
我的嵌套字典列表如下:
{'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}}
我的输出应该是
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
我尝试了什么,我可以做 1、3、4 类,但无法弄清楚我尝试过 concat 和 for 嵌套循环的第二类来得到它
ex=pd.concat([pd.Series(d) for d in (eg1)], axis=1).T
然后合并它。正如我所说,无法完全弄清楚!
解决方案
我写了一个简短的递归函数,它返回一个系列,或者如果您的 dict 中的一个键(例如category_2
)包含多个 dicts 的列表,则返回几个系列的串联。
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
推荐阅读
- azure-pipelines-release-pipeline - 我正在尝试使用 azure 管道生成发行说明,但在 wiki 页面更新程序上遇到问题
- sql-server - 无法创建调用 Oracle 函数的 SQL Server 函数?
- node.js - 在容器中合并 PDF 文件(Azure Blob 存储)
- flutter-web - 如何并行托管多个 Flutter Web 应用程序
- c++ - 如何在数组中查找奇数位数?
- r - 尝试计算 R 中每个登录 ID 的失败尝试次数
- azure-sql-database - 使用 ADF 将数据移动到 Azure SQL 时,为什么外部 IP 需要访问本地 sql 数据库?
- python - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 1: invalid continuation byte in Django
- apache-kafka - 与 spring cloud kafka stream 加入一对多关系
- python - VS 代码上的导入错误