DataFrame对象无append属性报错,求正确实现方法
问题描述
我通过for循环向DataFrame中添加多行数据,代码如下:
for i in data: result_df = result_df.append({'DEVICE': 'devicename1', 'POOL': 'poolname1', 'DSN': '1234x', 'STATUS': 'online', 'LAST UPDATED': 'date', 'RUNNING TIME': '1', 'CONNECTED HOST': 'somehost', 'HW_CONFIG': 'conf', 'USER': 'user_id1'}, ignore_index=True) print(result_df)
运行后报错:
AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?
附可复现代码:
import pandas as pd import os import json currDir = os.getcwd() def parse_json_response(): filename = "my_json_file.json" device_name = ["Trona", "Sheldon"] "creating dataframe to store result" column_names = ["DEVICE", "STATUS", "LAST UPDATED"] result_df = pd.DataFrame(columns=column_names) my_json_file = currDir + '/' + filename for i in range(len(device_name)): my_device_name = device_name[i] with open(my_json_file) as f: data = json.load(f) for devices in data: device_types = devices['device_types'] if my_device_name in device_types['name']: if device_types['name'] == my_device_name: device = devices['device_types']['name'] last_updated = devices['devices']['last_status_update'] device_status = devices['devices']['status'] result_df = result_df.append( {'DEVICE': device, 'STATUS': device_status, 'LAST UPDATED': last_updated}, ignore_index=True) print(result_df) parse_json_response()
JSON文件内容(保存为当前路径下的my_json_file.json):
[{"devices": {"id": 34815, "last_status_update": "2023-05-25 07:56:49", "status": "idle" }, "device_types": {"name": "Trona"}}, {"devices": {"id": 34815, "last_status_update": "2023-05-25 07:56:49", "status": "idle" }, "device_types": {"name": "Sheldon"}}]
解决方法
1. 问题根源
Pandas 2.0及后续版本已移除DataFrame.append()方法,这是报错的直接原因。官方推荐两种替代方案:先收集所有数据再一次性生成DataFrame(效率更高),或使用pd.concat()逐行拼接。
2. 优化后的实现方案
方案一:先收集数据再生成DataFrame(推荐)
避免循环中频繁操作DataFrame,大幅提升效率:
import pandas as pd import os import json currDir = os.getcwd() def parse_json_response(): filename = "my_json_file.json" device_name = ["Trona", "Sheldon"] column_names = ["DEVICE", "STATUS", "LAST UPDATED"] # 初始化列表存储所有行数据 data_list = [] my_json_file = currDir + '/' + filename # 仅读取一次JSON文件,避免重复IO操作 with open(my_json_file) as f: data = json.load(f) for devices in data: dev_name = devices['device_types']['name'] # 合并重复判断,直接检查设备是否在目标列表中 if dev_name in device_name: data_list.append({ 'DEVICE': dev_name, 'STATUS': devices['devices']['status'], 'LAST UPDATED': devices['devices']['last_status_update'] }) # 一次性生成DataFrame result_df = pd.DataFrame(data_list, columns=column_names) print(result_df) parse_json_response()
方案二:用pd.concat()替代append()
如果需要逐行拼接,可替换原代码中的append逻辑:
# 替换原循环内的append行 new_row = pd.DataFrame([{'DEVICE': device, 'STATUS': device_status, 'LAST UPDATED': last_updated}]) result_df = pd.concat([result_df, new_row], ignore_index=True)
3. 额外优化说明
- 移除了原代码中循环内重复读取JSON文件的冗余操作,仅读取一次即可。
- 合并了原代码中重复的设备名称判断条件,简化逻辑。
内容的提问来源于stack exchange,提问作者iltech
相关产品推荐
相关产品推荐

