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

循环向DataFrame添加行及多DataFrame拼接问题求助

Pandas循环生成DataFrame拼接问题解决

最优实现方案

建议不要在循环内反复拼接DataFrame,提前收集所有行数据后一次性构造DataFrame,性能远高于循环拼接,同时避免重复行问题,代码如下:

import pandas as pd
from scipy import spatial

def nearest_neighbors(coordinates, wafer_map):
    cols = ["Coordinates", "Distance to nearest coordinates", "Nearest coordinates"]
    # 提前构建KDTree,无需每次循环重复创建,大幅提升运算效率
    map_tree = spatial.cKDTree(wafer_map)
    # 存储所有行的计算结果
    all_result = []
    for row in coordinates:
        distance, index = map_tree.query(row)
        all_result.append([row, distance, wafer_map[index]])
    # 所有数据收集完成后一次性生成DataFrame
    df = pd.DataFrame(all_result, columns=cols)
    return df

# 调用测试
test = nearest_neighbors(coordinates, wafer_map)
print(test)

独立DataFrame拼接方案

如果你确实需要将循环生成的多个独立DataFrame拼接为完整DataFrame,可以将每次生成的单页DataFrame存入列表,最后用pd.concat一次性拼接:

import pandas as pd
from scipy import spatial
from collections import defaultdict

def nearest_neighbors2(coordinates, wafer_map):
    cols = ["Coordinates", "Distance to nearest coordinates", "Nearest coordinates"]
    map_tree = spatial.cKDTree(wafer_map)
    # 存储所有独立DataFrame
    df_list = []
    for row in coordinates:
        distance, index = map_tree.query(row)
        num_list = [row, distance, wafer_map[index]]
        d = defaultdict(list)
        for a, b in zip(cols, num_list):
            d[a].append(b)
        df_single = pd.DataFrame(d)
        df_list.append(df_single)
    # 拼接所有DataFrame,重置索引
    total_df = pd.concat(df_list, ignore_index=True)
    return total_df

原代码问题说明

  • 第一版代码重复行问题:你在每次遍历coordinates的行时,都新建了空列表lst,并重复添加了len(coordinates)次当前行的计算结果,所以生成的DataFrame每行数据完全相同。
  • 第二版代码独立DF问题:你在每次遍历行时都新建了空的df2,仅存储当前行的计算结果,没有收集历史遍历的结果,所以每次输出都是仅含一行的独立DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:36:04