如何在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
相关产品推荐
相关产品推荐

