如何迭代pandas DataFrame列实现a列全量值与b列全量值的批量运算
代码调整方案
你原来的代码存在几个核心问题:
- 循环对象错误:
for num in data.columns[0]实际是在遍历a列列名字符串的单个字符,而非a列的元素 - 固定取a列首行值
data.at[0,'a'],导致只能处理单个a元素 - 打印语句在循环外,仅能输出最后一次计算结果
你可以直接用pandas+numpy的向量化广播实现全量计算,无需嵌套循环,代码效率更高:
import pandas as pd import numpy as np # 读取数据 data = pd.read_csv("/home/Documents/test.csv") # 取出b列首行值 b_first = data.loc[0, 'b'] # 取出a、b列转为数组 a_arr = data['a'].values b_arr = data['b'].values # 利用广播运算,一次性计算所有组合:结果的每一行对应一个a列元素,每一列对应一个b遍历项 result = (a_arr.reshape(-1,1) * a_arr) / (b_first * b_arr) # 转为DataFrame,方便查看和导出 result_df = pd.DataFrame(result, columns=[f'计算结果_{i+1}' for i in range(len(b_arr))]) print(result_df) # 如果需要导出为csv可以加这行 # result_df.to_csv("/home/Documents/calc_result.csv", index=False)
如果想保留嵌套循环的写法方便理解,也可以用下面的版本:
import pandas as pd data = pd.read_csv("/home/Documents/test.csv") b_first = data.loc[0, 'b'] a_list = data['a'].tolist() b_list = data['b'].tolist() result = [] # 遍历每个a列元素作为当前选中项 for current_a in a_list: row_res = [] # 遍历所有行的a、b值做运算 for a_j, b_j in zip(a_list, b_list): x = (current_a * a_j) / (b_first * b_j) row_res.append(x) result.append(row_res) result_df = pd.DataFrame(result, columns=[f'计算结果_{i+1}' for i in range(len(b_list))]) print(result_df)
内容的提问来源于stack exchange,提问作者satyam sangeet
相关产品推荐
相关产品推荐

