gpt4 book ai didi

python - 从具有重复键值对的深度嵌套字典列表中提取值

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:17 26 4
gpt4 key购买 nike

尝试从复杂而困惑的字典列表中提取总现金和现金等价物值。下面是该结构的简化版本。

我尝试过: map 、Dataframe.from_dict 和 .from_records。尽量避免使用 RE。

我被难住了。

 [{u'Fields': [],
u'ReportDate': u'2 June 2016',
u'ReportID': u'BalanceSheet',
u'ReportName': u'Balance Sheet',
u'ReportTitles': [u'Balance Sheet',
u'Test Company',
u'As at 30 June 2016'],
u'ReportType': u'BalanceSheet',
u'Rows': [{u'Cells': [{u'Value': u''},
{u'Value': u'30 Jun 2016'},
{u'Value': u'30 Jun 2015'}],
u'RowType': u'Header'},
{u'RowType': u'Section', u'Rows': [], u'Title': u'Assets'},
{u'RowType': u'Section',
u'Rows': [{u'Cells': [{u'Attributes': [{u'Id': u'account',
u'Value': u'c0bxx922-cc31-4d53-b060-cbf23511`2533'}],
u'Value': u'Test Bank 1'},
{u'Attributes': [{u'Id': u'account',
u'Value': u'c1b4xx22-cc31-4d53-b060-cb45282533'}],
u'Value': u'5555.20'},
{u'Attributes': [{u'Id': u'account',
u'Value': u'c2b44922-cc31-4d53-b060-cbf4532582533'}],
u'Value': u'5555.20'}],
u'RowType': u'Row'},
{u'Cells': [{u'Attributes': [{u'Id': u'account',
u'Value': u'290c7c3c-a712-4ads6f-9a2f-3d5258aad5a9e'}],
u'Value': u'Test Bank 2'},
{u'Attributes': [{u'Id': u'account',
u'Value': u'490c7c32-axxxdf6f-9a2f-3db682a3ad5a9e'}],
u'Value': u'55555.20'},
{u'Attributes': [{u'Id': u'account',
u'Value': u'490xxc3c-a71-adsf6f-9a2f-3d3aad5a9e'}],
u'Value': u'55555.20'}],
u'RowType': u'Row'},
{u'Cells': [{u'Attributes': [{u'Id': u'account',
u'Value': u'c6d4da40-f0df1b0-8f7d-xx45b1405'}],
u'Value': u'Test Bank 3'},
{u'Attributes': [{u'Id': u'account',
u'Value': u'c6d4da4fg-df-41b0-8f7d-54xx345b1405'}],
u'Value': u'5555.20'},
{u'Attributes': [{u'Id': u'account',
u'Value': u'c6d4dafgss-9-41b0-8f7d-60xx5b1405'}],
u'Value': u'5555.20'}],
u'RowType': u'Row'},
{u'Cells': [{u'Value': u'Total Cash and Cash Equivalents'},
{u'Value': u'5555555.20'},
{u'Value': u'5555555.20'}],
u'RowType': u'SummaryRow'}],
u'Title': u'Cash and Cash Equivalents'},
{u'RowType': u'Section',

最佳答案

如果您知道数据将具有与上面完全相同的格式,并且您确实只需要这两个值,则可以直接访问它(假设 data 是您的上述结构):

print data[0]['Rows'][2]['Rows'][3]['Cells'][1]['Value']
print data[0]['Rows'][2]['Rows'][3]['Cells'][2]['Value']

但是,无论是写下正确的表达式还是更改列表顺序(可能未在您的格式中定义),这都容易出错。由于数据背后存在语义结构,因此您可以将原始数据转换回易于访问的对象。您可能想要更改一些细节,但这是一个很好的起点:

from collections import Mapping
import pandas as pd

class Report(Mapping):
def __init__(self, data):
self.sections = OrderedDict()
for row in data.pop('Rows'):
getattr(self, 'make_%s' % row['RowType'])(row)
self.__dict__.update(data)

def make_Header(self, row):
self.header = [c['Value'] for c in row['Cells']]

def make_Section(self, sec):
def make_row(row):
cells = [c['Value'] for c in row['Cells']]
return pd.Series(map(float, cells[1:]), name=cells[0])

self.sections[sec['Title']] = pd.DataFrame(make_row(r) for r in sec['Rows'])

def __getitem__(self, item):
return self.sections[item]

def __len__(self):
return len(self.sections)

def __iter__(self):
return iter(self.sections)


report = Report(data[0])
print report.ReportName
print report['Cash and Cash Equivalents']

关于python - 从具有重复键值对的深度嵌套字典列表中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37578346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com