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

如何在Pandas中通过函数从多DataFrame生成数组与距离矩阵?

问题描述

我拥有4个不同的DataFrame(df、df1、df2、df3),希望为每个DataFrame生成对应的all_points数组(all_points、all_points1、all_points2、all_points3)以及距离矩阵dm(dm、dm1、dm2、dm3)。当前我通过重复代码实现该逻辑:

all_points = df[['lat', 'lng']].values

dm = scipy.spatial.distance.cdist(all_points,
                                  all_points,
                                  get_distance)

all_points1 = df1[['lat', 'lng']].values

dm1 = scipy.spatial.distance.cdist(all_points1,
                                  all_points1,
                                  get_distance)

但我尝试编写的函数无法正常工作:

def b(all_points):
    all_points = df[['lat', 'lng']].values


    return all_points

all_points = b(df)
all_points1 = b(df1)
...

请问是否可以通过函数完成该操作?

解决方案

你的函数失效原因是硬编码了固定的DataFrame df,不管传入什么参数,函数内部都只处理df,自然无法生成对应df1、df2的结果。当然可以用函数实现,推荐两种方式:

1. 单个处理函数

写一个函数接收DataFrame作为参数,返回对应的all_points和距离矩阵:

import scipy.spatial.distance as ssd

def process_df(input_df, distance_func):
    # 生成all_points数组
    all_points = input_df[['lat', 'lng']].values
    # 计算距离矩阵
    distance_matrix = ssd.cdist(all_points, all_points, distance_func)
    return all_points, distance_matrix

调用方式:

all_points, dm = process_df(df, get_distance)
all_points1, dm1 = process_df(df1, get_distance)
all_points2, dm2 = process_df(df2, get_distance)
all_points3, dm3 = process_df(df3, get_distance)

2. 批量处理函数

如果DataFrame数量多,推荐用字典批量存储结果,避免创建一堆相似变量:

def process_multiple_dfs(df_dict, distance_func):
    results = {}
    for name, df in df_dict.items():
        all_points = df[['lat', 'lng']].values
        dm = ssd.cdist(all_points, all_points, distance_func)
        results[f"{name}_all_points"] = all_points
        results[f"{name}_dm"] = dm
    return results

调用方式:

# 把所有DataFrame放到字典里
df_collection = {
    "df": df,
    "df1": df1,
    "df2": df2,
    "df3": df3
}

# 批量处理
results = process_multiple_dfs(df_collection, get_distance)

# 访问结果:比如df的all_points就是results['df_all_points'],距离矩阵是results['df_dm']
all_points = results['df_all_points']
dm = results['df_dm']
all_points1 = results['df1_all_points']
dm1 = results['df1_dm']

这样既避免了重复代码,也让变量管理更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:10:29