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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:00:52