如何在Python中基于两个DataFrame实现条件计算
解决两个DataFrame的条件计算问题
首先先创建你描述的两个DataFrame:
import pandas as pd import numpy as np # 初始化df1 df1 = pd.DataFrame({ 'YN': ['Y', 'N'], 'Cost': [100, 50] }) # 初始化df2 df2 = pd.DataFrame({ 'Category': ['A', 'B'], 'Factor': [0.10, 0.20] })
步骤1:提取df2中的对应因子
先把df2里Category为A和B的Factor提取出来,方便后续调用:
# 提取Category=A的因子 factor_a = df2.loc[df2['Category'] == 'A', 'Factor'].iloc[0] # 提取Category=B的因子 factor_b = df2.loc[df2['Category'] == 'B', 'Factor'].iloc[0]
用iloc[0]比直接取数组值更稳妥,避免索引相关的小问题。
方法1:用np.where实现条件判断(最推荐,简洁高效)
这是处理简单条件逻辑最常用的方法,一行代码搞定:
df1['Price'] = np.where(df1['YN'] == 'Y', df1['Cost'] * factor_a, df1['Cost'] * factor_b)
逻辑:如果YN等于Y,就用Cost乘factor_a;否则乘factor_b。
方法2:字典映射+列运算(可读性强)
先把YN值和对应的因子做成字典,再映射后计算:
# 建立YN到因子的映射字典 factor_dict = {'Y': factor_a, 'N': factor_b} # 先映射得到每行对应的因子,再和Cost相乘 df1['Price'] = df1['YN'].map(factor_dict) * df1['Cost']
方法3:apply逐行处理(适合复杂逻辑,效率稍低)
如果后续逻辑变复杂,可自定义函数逐行计算:
def compute_price(row): if row['YN'] == 'Y': return row['Cost'] * factor_a else: return row['Cost'] * factor_b # axis=1表示按行应用函数 df1['Price'] = df1.apply(compute_price, axis=1)
验证结果
运行任意一种方法后,打印df1会得到:
YN Cost Price 0 Y 100 10.0 1 N 50 10.0
扩展提示
如果你的数据里YN有其他取值,或者df2的Category可能缺失,可以用fillna设置默认值,比如:
# 方法2中添加默认因子(比如0.05) df1['Price'] = df1['YN'].map(factor_dict).fillna(0.05) * df1['Cost']
内容的提问来源于stack exchange,提问作者ma0ma0
相关产品推荐
相关产品推荐

