Python提取Unleashed数组数据:DataFrame格式异常排查求助
问题描述
我使用unleashed_py库提取Unleashed数据,返回的数组示例如下(单张发票包含多条明细):
[{ 'OrderNumber': 'SO-00000742', 'QuoteNumber': None, 'InvoiceDate': '/Date(1658496322067)/', 'InvoiceLines': [{'LineNumber': 1, 'LineType': None}, {'LineNumber': 2, 'LineType': None}], 'Guid': '8f6b89da-1e6e-42288a24-902a-038041e04f06', 'LastModifiedOn': '/Date(1658496322221)/'}]
我需要生成每行对应一条发票明细、公共字段(OrderNumber、QuoteNumber等)随明细重复的DataFrame,但运行以下代码后,只有发票行数据被追加,公共字段没有按明细条数重复,请问代码哪里出问题了?
有问题的代码:
order_number = [] quote_number = [] invoice_date = [] invoicelines = [] invoice_line_number = [] invoice_line_type = [] guid = [] last_modified = [] for item in df: order_number.append(item.get('OrderNumber')) quote_number.append(item.get('QuoteNumber')) invoice_date.append(item.get('InvoiceDate')) guid.append(item.get('Guid')) last_modified.append(item.get('LastModifiedOn')) lines = item.get('InvoiceLines') for item_sub_2 in lines: invoice_line_number.append('LineNumber') invoice_line_type.append('LineType') df_order_number = pd.DataFrame(order_number) df_quote_number = pd.DataFrame(quote_number) df_invoice_date = pd.DataFrame(invoice_date) df_invoice_line_number = pd.DataFrame(invoice_line_number) df_invoice_line_type = pd.DataFrame(invoice_line_type) df_guid = pd.DataFrame(guid) df_last_modified = pd.DataFrame(last_modified) df_row = pd.concat([ df_order_number, df_quote_number, df_invoice_date, df_invoice_line_number, df_invoice_line_type, df_guid, df_last_modified ], axis = 1)
问题分析与解决
核心问题
- 公共字段只追加一次:你在外部循环中给
order_number、quote_number等公共字段列表仅追加一次当前发票的值,但一张发票有多条明细时,这些公共字段需要重复对应次数才能和明细行匹配。现在公共字段列表长度等于发票数量,明细字段列表长度是所有发票的明细总数,两者长度不匹配,concat后公共字段自然不会重复。 - 明细字段取值错误:内层循环里你追加的是固定字符串
'LineNumber'和'LineType',而非从item_sub_2中提取的实际行号和类型值,导致明细列全是无效的固定文本。
修正后的代码
import pandas as pd # 初始化存储数据的空列表 order_number = [] quote_number = [] invoice_date = [] invoice_line_number = [] invoice_line_type = [] guid = [] last_modified = [] # 遍历每一张发票数据 for item in df: # 先提取当前发票的公共字段值,避免重复调用get curr_order = item.get('OrderNumber') curr_quote = item.get('QuoteNumber') curr_date = item.get('InvoiceDate') curr_guid = item.get('Guid') curr_modified = item.get('LastModifiedOn') # 获取当前发票的所有明细行,默认空列表防止报错 lines = item.get('InvoiceLines', []) # 遍历每一条明细,公共字段随明细重复追加 for line in lines: order_number.append(curr_order) quote_number.append(curr_quote) invoice_date.append(curr_date) guid.append(curr_guid) last_modified.append(curr_modified) # 追加明细的实际字段值 invoice_line_number.append(line.get('LineNumber')) invoice_line_type.append(line.get('LineType')) # 直接用字典构建DataFrame,更简洁高效 df_row = pd.DataFrame({ 'OrderNumber': order_number, 'QuoteNumber': quote_number, 'InvoiceDate': invoice_date, 'LineNumber': invoice_line_number, 'LineType': invoice_line_type, 'Guid': guid, 'LastModifiedOn': last_modified })
修正说明
- 将公共字段的
append操作移至明细的内层循环中,确保每条明细都对应追加一次当前发票的公共字段值,保证所有列表长度一致。 - 修正明细字段的取值逻辑,从明细字典中提取真实的
LineNumber和LineType值,而非固定字符串。 - 改用字典直接构建DataFrame,替代逐个创建小DataFrame再concat的方式,代码更简洁且性能更好。
内容的提问来源于stack exchange,提问作者eponkratova
相关产品推荐
相关产品推荐

