如何对字典中多份DataFrame按行计算各列均值?
问题描述
需要计算字典中5个DataFrame(对应experiment1至experiment5)的均值,要求为每个DataFrame的V1、V2列分别得到3×1的均值向量(即5组实验中同一行的数值求平均)。
示例DataFrame结构:
dict_df[key] V1 V2 0 5 10 1 3 10 2 4 16
尝试过两种方式但均未成功:
- 用循环计算对应行均值,但无法正确访问目标值
- 执行代码
out=pd.concat(df_dict.values()).mean(level=0),报错信息:'numpy.ndarray' object is not callable
创建字典的代码如下:
dfs = {} for (i, experiment) in enumerate(all_experiments): df = pd.read_fwf(experiment) df_ = pd.DataFrame(columns=['V1', 'V2']) df_['V1'] = torch.tensor(df['V1'].values, dtype=torch.float32) df_['V2'] = torch.tensor(-df['V2'].values, dtype=torch.float32) dfs[i] = df_ df_dict = pd.concat(dfs, sort=False)
解决方案
核心问题说明
你将pd.concat(dfs)的结果赋值给了df_dict,此时df_dict是一个多层索引(MultiIndex)的DataFrame,而非字典。df_dict.values()会返回numpy数组,这也是你之前执行pd.concat(df_dict.values())报错的原因。
高效计算方法
方法1:基于已生成的多层索引DataFrame计算
直接利用df_dict的第二层索引(行号)分组求均值:
# 按第二层索引(原始行号)分组,计算各列均值 mean_df = df_dict.groupby(level=1).mean()
执行后mean_df是一个3行2列的DataFrame,其中V1、V2列分别对应每行的均值向量,单独提取某一列(如mean_df['V1'])就是你需要的3×1均值向量。
方法2:保留字典结构直接计算
如果不想提前拼接成多层索引DataFrame,可直接对字典内的DataFrame做对齐拼接后计算:
# 将字典中所有DataFrame按行索引对齐拼接 combined_df = pd.concat(dfs.values(), axis=0, keys=range(len(dfs))) # 按原始行号分组求均值 mean_df = combined_df.groupby(level=1).mean()
优化建议
创建DataFrame时无需先转成torch.tensor,直接用pandas的类型转换更高效:
df_['V1'] = df['V1'].astype('float32') df_['V2'] = (-df['V2']).astype('float32')
若后续需要用PyTorch处理,再将结果转成tensor即可。
内容的提问来源于stack exchange,提问作者user362981
相关产品推荐
相关产品推荐

