如何遍历CSV文件中的指定id并为每个id计算pearson系数
问题解决方法
原有代码错误点
- 列名不匹配:CSV中id列名称为
ids,你代码中调用的是df['id'],会触发键不存在报错 - 未按id筛选数据:循环中每次都使用全量数据集计算皮尔逊系数,结果全部为全量数据的计算值,完全不符合按id分组计算的需求
- 循环范围逻辑错误:
range为左闭右开区间,会丢失最大id的计算,且如果id不是连续整数时会出现大量无效计算,是运行耗时极长的核心原因 - 计算结果未关联对应id:最终输出的结果列表无法和id对应,没有实用价值
最优实现方案(pandas分组计算,效率远高于自行写循环)
直接用pandas原生的groupby做分组计算,底层做了矢量运算优化,大数据量下也不会卡顿:
import pandas as pd import scipy.stats as stats path = 'C:/path/' df = pd.read_csv(path + 'mycsvfile.csv') # 定义单组皮尔逊系数计算函数 def calc_pearson(group): corr, pvalue = stats.pearsonr(group['year'], group['mean']) return pd.Series([corr, pvalue], index=['pearson_corr', 'p_value']) # 按id分组计算,结果自动关联对应id res_df = df.groupby('ids', as_index=True).apply(calc_pearson).reset_index() # 如果你需要单独的皮尔逊系数列表,直接取对应列转换即可 corr_list = res_df['pearson_corr'].tolist()
循环写法修正版(仅保留循环逻辑的情况使用)
import pandas as pd import scipy.stats as stats path = 'C:/path/' df = pd.read_csv(path + 'mycsvfile.csv') res = [] # 取所有唯一id,避免id不连续导致的无效计算 unique_ids = df['ids'].unique() for id_val in unique_ids: # 筛选当前id对应的子数据集 sub_df = df[df['ids'] == id_val] corr, pvalue = stats.pearsonr(sub_df['year'], sub_df['mean']) res.append({'id': id_val, 'pearson_corr': corr, 'p_value': pvalue}) res_df = pd.DataFrame(res)
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

