如何在Pandas中按行遍历DataFrame并根据条件更新Points值?
Pandas逐行更新余额Points的实现方法
作为Pandas新手,你可以用两种方式实现这个需求:一种是直观的逐行循环(适合理解逻辑),另一种是Pandas推荐的向量化操作(效率更高)。
方法一:逐行循环(逻辑直观,适合新手)
先构建示例DataFrame,然后通过iterrows()逐行遍历,根据条件更新Points:
import pandas as pd # 创建你提供的示例DataFrame data = { 'A': [2.43, 2.58, 1.61, 2.7], 'B': [1.55, 1.49, 2.32, 1.46], 'A_yes': [1, 0, 1, 1], 'B_yes': [0, 1, 0, 0] } df = pd.DataFrame(data) # 初始化初始余额 points = 500 # 逐行遍历并更新余额 for _, row in df.iterrows(): if row['A_yes'] == 1: points *= row['A'] elif row['B_yes'] == 1: points *= row['B'] print(f"最终余额: {points}")
运行这段代码会输出最终余额:7869.59145,和手动计算的结果完全一致。iterrows()会返回每一行的索引和行数据,逐行判断条件后更新points变量,逻辑和你手动计算的步骤完全对应。
方法二:向量化操作(Pandas推荐,效率更高)
当处理大数据集时,逐行循环效率较低,推荐用向量化操作:先计算每一行对应的乘数,再通过累乘得到最终结果。
import pandas as pd # 创建示例DataFrame data = { 'A': [2.43, 2.58, 1.61, 2.7], 'B': [1.55, 1.49, 2.32, 1.46], 'A_yes': [1, 0, 1, 1], 'B_yes': [0, 1, 0, 0] } df = pd.DataFrame(data) # 生成每一行的乘数:A_yes=1取A列值,否则取B列值 df['multiplier'] = df.apply(lambda x: x['A'] if x['A_yes'] == 1 else x['B'], axis=1) # 初始余额乘以所有乘数的乘积 initial_points = 500 final_points = initial_points * df['multiplier'].prod() print(f"最终余额: {final_points}")
这段代码的结果和循环方法完全相同,但效率远高于逐行循环,尤其当DataFrame行数很多时优势明显。
内容的提问来源于stack exchange,提问作者monica
相关产品推荐
相关产品推荐

