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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:52:43