You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
问题分析与解决

核心问题

  1. 公共字段只追加一次:你在外部循环中给order_number、quote_number等公共字段列表仅追加一次当前发票的值,但一张发票有多条明细时,这些公共字段需要重复对应次数才能和明细行匹配。现在公共字段列表长度等于发票数量,明细字段列表长度是所有发票的明细总数,两者长度不匹配,concat后公共字段自然不会重复。
  2. 明细字段取值错误:内层循环里你追加的是固定字符串'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:24:22