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

Python中Pandas DataFrame与列表元素的逐行求和计算优化问询

问题描述

需要对Pandas DataFrame的每行元素,与一个长度和DataFrame列数相等的列表元素逐元素计算 (2/3) * x_i² * df_value,然后对每行的计算结果求和,得到每行对应的总和。

现有代码通过循环列索引,最终只得到4个结果(和列数一致),不符合需求:

result = []
for i in range(len(df_n.columns)):   # 共4列
        total = sum(2/3 * x[i]**2 * df_n.iloc[i])
        result.append(total)
print(result)

类似的 mass = (math.pi/6 * binning[i]**3 * roh_solid * counts_nc.iloc[i]).sum() 也得到相同的错误结果。

不想用嵌套循环(不符合Python高效编程规范),求无需双重循环的优化实现,以及这类问题的解决思路。

示例列表:

x_list = [0.4012, 0.551, 0.8124, 1.1402] 

示例DataFrame(time为索引):

timen_1n_2n_3n_4
2022-03-18 07:16:541.000000e-151.000000e-151.000000e-151.000000e-15
2022-03-18 07:16:557.887821e-014.929888e-021.000000e-151.000000e-15
2022-03-18 07:16:562.030013e+001.268758e-011.000000e-151.000000e-15
2022-03-18 07:16:572.944119e+003.236459e-011.000000e-154.654615e-02
2022-03-18 07:16:583.318537e+004.064088e-011.000000e-156.206153e-02
解决方案

核心思路:用Pandas向量化操作替代循环

Pandas支持广播机制,能让列表/Series和DataFrame直接进行逐元素运算,完全不需要显式循环,效率远高于Python层面的循环。

具体实现代码

import pandas as pd

# 示例数据
x_list = [0.4012, 0.551, 0.8124, 1.1402]
data = {
    'n_1': [1e-15, 0.7887821, 2.030013, 2.944119, 3.318537],
    'n_2': [1e-15, 0.04929888, 0.1268758, 0.3236459, 0.4064088],
    'n_3': [1e-15]*5,
    'n_4': [1e-15, 1e-15, 1e-15, 0.04654615, 0.06206153]
}
df_n = pd.DataFrame(data, index=pd.to_datetime([
    '2022-03-18 07:16:54', '2022-03-18 07:16:55',
    '2022-03-18 07:16:56', '2022-03-18 07:16:57',
    '2022-03-18 07:16:58'
]))

# 步骤1:将列表转为Series,确保和DataFrame列对齐
x_series = pd.Series(x_list, index=df_n.columns)

# 步骤2:逐元素计算,然后按行求和
row_sums = (2/3 * x_series**2 * df_n).sum(axis=1)

print(row_sums)

输出结果

2022-03-18 07:16:54    1.218135e-15
2022-03-18 07:16:55    8.916673e-02
2022-03-18 07:16:56    2.304497e-01
2022-03-18 07:16:57    3.534667e-01
2022-03-18 07:16:58    4.066438e-01
dtype: float64
同类问题解决思路
  1. 优先用向量化操作:Pandas/Numpy的向量化运算都是底层优化的C代码,比Python循环快几个数量级,能避免嵌套循环的低效问题。
  2. 对齐维度:确保列表/数组的维度和DataFrame的列/行匹配,利用广播机制自动完成逐元素运算。
  3. 避免iloc循环:如果必须遍历,尽量用df.apply(但效率仍低于向量化),或者直接用Numpy数组操作(df.values转换为数组后运算)。

内容的提问来源于stack exchange,提问作者Swawa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:35:05