Python/pandas实现标量列表与向量分组逐元素乘法的方法
问题根因
原代码的双层循环直接将每一次单值计算的i*j追加到最外层列表,没有为a中的每个标量单独创建存储整组计算结果的子列表,因此最终得到的是扁平化的一维列表,不符合分组嵌套的预期结构。
实现方法
方法1:修正原生循环逻辑
遍历a中每个标量时,先初始化临时子列表存储当前标量与b所有元素逐元素相乘的结果,整组计算完成后再将子列表追加到总结果中:
df = [] a = [1,2] b = [1,2,3,4] for i in a: sub_result = [] for j in b: sub_result.append(i * j) df.append(sub_result)
运行后df的值即为预期的[[1,2,3,4], [2,4,6,8]]。
也可以用列表推导式简化写法,不需要显式写内层append逻辑:
a = [1,2] b = [1,2,3,4] df = [[i * j for j in b] for i in a]
方法2:pandas向量化实现(大数据量场景更高效)
不需要手写循环,利用numpy/pandas的广播机制直接完成批量计算,结果可直接转为DataFrame:
import pandas as pd import numpy as np a = [1,2] b = [1,2,3,4] # 广播计算得到二维结果数组 result_array = np.array(a).reshape(-1, 1) * np.array(b) # 转为DataFrame,列名可直接用b的元素值 df = pd.DataFrame(result_array, columns=b)
最终得到的DataFrame结构如下,每一行对应a中一个标量与b逐元素相乘的结果:
1 2 3 4 0 1 2 3 4 1 2 4 6 8
如果需要嵌套列表格式的结果,调用result_array.tolist()即可拿到[[1,2,3,4], [2,4,6,8]]。
内容的提问来源于stack exchange,提问作者xboxuser
相关产品推荐
相关产品推荐

