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为索引):
| time | n_1 | n_2 | n_3 | n_4 |
|---|---|---|---|---|
| 2022-03-18 07:16:54 | 1.000000e-15 | 1.000000e-15 | 1.000000e-15 | 1.000000e-15 |
| 2022-03-18 07:16:55 | 7.887821e-01 | 4.929888e-02 | 1.000000e-15 | 1.000000e-15 |
| 2022-03-18 07:16:56 | 2.030013e+00 | 1.268758e-01 | 1.000000e-15 | 1.000000e-15 |
| 2022-03-18 07:16:57 | 2.944119e+00 | 3.236459e-01 | 1.000000e-15 | 4.654615e-02 |
| 2022-03-18 07:16:58 | 3.318537e+00 | 4.064088e-01 | 1.000000e-15 | 6.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
同类问题解决思路
- 优先用向量化操作:Pandas/Numpy的向量化运算都是底层优化的C代码,比Python循环快几个数量级,能避免嵌套循环的低效问题。
- 对齐维度:确保列表/数组的维度和DataFrame的列/行匹配,利用广播机制自动完成逐元素运算。
- 避免iloc循环:如果必须遍历,尽量用
df.apply(但效率仍低于向量化),或者直接用Numpy数组操作(df.values转换为数组后运算)。
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

