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

如何在for循环中向预先创建的Pandas DataFrame追加数据?

如何在循环中将XML解析值追加到预定义的Pandas DataFrame?

首先得说,直接在循环里逐行追加到DataFrame不是最高效的做法(尤其是数据量不小的时候),所以先给你推荐性能更优的方案,再提一下循环内逐行处理的方法(虽然不推荐,但你如果想了解也可以参考)。

最优方案:先收集所有数据,再一次性生成DataFrame

Pandas的逐行追加操作效率很低,所以我们可以先把每一行的数据存到一个列表里,等循环结束后再一次性把列表转成DataFrame,合并到你预先创建的空DataFrame中。

修改你的代码如下:

import pandas as pd

# 预定义列和空DataFrame
columns = ['BIN','Date_of_registration', 'Tax','TaxName','KBK', 'KBKName','Paynum','Paytype', 'EntryType','Writeoffdate', 'Summa']
df = pd.DataFrame(columns=columns)

# 初始化空列表,用来存每一行的数据字典
data_rows = []

for elements in tree.findall('{http://xmlns.kztc-cits/sign}payment'):
    print("hello")
    # 解析XML字段(注意:你原来的代码里没处理BIN和Date_of_registration,记得补充对应的标签查找逻辑)
    tax = elements.find('{http://xmlns.kztc-cits/sign}TaxOrgCode').text
    tax_name_ru = elements.find('{http://xmlns.kztc-cits/sign}NameTaxRu').text
    kbk = elements.find('{http://xmlns.kztc-cits/sign}KBK').text
    kbk_name_ru = elements.find('{http://xmlns.kztc-cits/sign}KBKNameRu').text
    paynum = elements.find('{http://xmlns.kztc-cits/sign}PayNum').text
    paytype = elements.find('{http://xmlns.kztc-cits/sign}PayType').text
    entry_type = elements.find('{http://xmlns.kztc-cits/sign}EntryType').text
    writeoffdate = elements.find('{http://xmlns.kztc-cits/sign}WriteOffDate').text
    summa = elements.find('{http://xmlns.kztc-cits/sign}Summa').text
    
    # 把当前行的数据整理成字典,键要和DataFrame的列名完全对应
    row_data = {
        'BIN': None,  # 替换成你实际获取BIN的代码,比如 elements.find('对应标签').text
        'Date_of_registration': None,  # 同样替换成实际的XML标签查找逻辑
        'Tax': tax,
        'TaxName': tax_name_ru,
        'KBK': kbk,
        'KBKName': kbk_name_ru,
        'Paynum': paynum,
        'Paytype': paytype,
        'EntryType': entry_type,
        'Writeoffdate': writeoffdate,
        'Summa': summa
    }
    
    # 将字典加入列表
    data_rows.append(row_data)
    print(tax, tax_name_ru, kbk, kbk_name_ru, paynum, paytype, entry_type, writeoffdate, summa)

# 循环结束后,将列表转成DataFrame并合并到原df
df = pd.concat([df, pd.DataFrame(data_rows)], ignore_index=True)

循环内逐行追加的方法(不推荐)

如果你一定要在循环里处理每一行,可以用df.loc[len(df)] = row_data的方式,但注意这种方法在数据量大的时候会很慢,而且len(df)每次都会计算DataFrame的长度,性能较差。示例代码如下:

# 保持你原来的预定义列和空df不变
columns = ['BIN','Date_of_registration', 'Tax','TaxName','KBK', 'KBKName','Paynum','Paytype', 'EntryType','Writeoffdate', 'Summa']
df = pd.DataFrame(columns=columns)

for elements in tree.findall('{http://xmlns.kztc-cits/sign}payment'):
    # 解析字段的代码和之前一样
    tax = elements.find('{http://xmlns.kztc-cits/sign}TaxOrgCode').text
    # ... 其他字段解析
    
    # 整理row_data字典(同样要补充BIN和Date_of_registration的取值)
    row_data = {
        'BIN': None,
        'Date_of_registration': None,
        'Tax': tax,
        # ... 其他键值对
    }
    
    # 逐行追加到df
    df.loc[len(df)] = row_data

注意事项

  • 你原来的代码里没有处理BIN和Date_of_registration这两个列的取值,记得补充对应的XML标签查找代码,不然这两列的值会是None。
  • 尽量优先使用第一种收集列表再合并的方法,尤其是当你要处理的XML数据条目很多的时候,性能差距会很明显。

内容的提问来源于stack exchange,提问作者Mikoupgrade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:02:52