如何在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
相关产品推荐
相关产品推荐

