如何对DataFrame中不同长度数组执行按元素平均?
解决不同长度数组的元素-wise平均问题
问题回顾
你需要对多个长度不一的数组按位置计算平均值,示例如下:
A = [0,10,20] B = [10,40,60,80] C = [50,70] # 期望结果:[20, 40, 40, 80]
之前尝试用itertools.zip_longest搭配statistics.mean时,填充0会拉低平均值,而mean又不支持None作为填充值。另外你的数组来源于pandas DataFrame的某一列,每行对应一个不同长度的数组。
正确解法
核心思路是用np.nanmean自动忽略缺失值,结合zip_longest用NaN填充短数组的缺失位置,就能得到符合预期的结果。关键是要正确解包所有数组,让zip_longest对齐每个位置的元素。
修正后的代码
import pandas as pd import numpy as np from itertools import zip_longest df = pd.read_csv('data.csv') sec1 = df[(df['Color'] == 'blue') & (df['Type'] == 21)] # 提取DataFrame列中的所有数组到列表 all_arrays = sec1['time'].tolist() # 对齐所有数组,用NaN补位后逐组计算平均(自动忽略NaN) outcome = [np.nanmean(group) for group in zip_longest(*all_arrays, fillvalue=np.nan)] print(outcome)
关键说明
zip_longest(*all_arrays):这里的*是解包操作,把列表中的每个数组作为独立参数传给zip_longest,这样才能将所有数组的第1个元素、第2个元素……分别归为一组。fillvalue=np.nan:用NaN填充短数组缺失的位置,np.nanmean计算时会跳过这些NaN值,只对存在的元素求平均,完全匹配预期结果。- 针对示例数组的测试验证:
A = [0,10,20] B = [10,40,60,80] C = [50,70] all_arrays = [A,B,C] result = [np.nanmean(g) for g in zip_longest(*all_arrays, fillvalue=np.nan)] print(result) # 输出:[20.0, 40.0, 40.0, 80.0],与预期一致
额外排查点
如果你的sec1['time']列存储的是字符串格式的数组(比如CSV导出时未正确序列化),需要先转换为列表:
import ast sec1['time'] = sec1['time'].apply(ast.literal_eval)
内容的提问来源于stack exchange,提问作者sinisterfang
相关产品推荐
相关产品推荐

