循环向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
相关产品推荐
相关产品推荐

