Python中关联DataFrame计算Score列的函数实现请求
实现DataFrame区间匹配求和的Score计算函数
需要为DF1新增Score列,计算逻辑为:
- 对DF1每一行的
Age、Income、Contract Length字段,分别在DF2中找到对应变量的LQ-UQ区间(字段值 >=LQ且 <=UQ) - 取出每个字段匹配到的
Score值,求和后作为该行的Score值
示例数据
import pandas as pd DF1 = pd.DataFrame({ 'Age':[25, 54, 33], 'Income' :[10203, 23822, 84823], 'Contract Length':[18, 12, 36], }) DF2 = pd.DataFrame({ 'variable':['Age', 'Age', 'Age', 'Age', 'Income', 'Income', 'Income', 'Income', 'Contract Length', 'Contract Length', 'Contract Length', 'Contract Length'], 'LQ':[25, 32.25, 39.5, 46.75, 10203, 28858, 47513, 66168, 12, 18, 24, 30], 'UQ':[32.25, 39.5, 46.75, 54, 28858, 47513, 66168, 84823, 18, 24, 30, 36], 'Score':[5, 10, 15, 20, 10, 15, 20, 25, 15, 20, 25, 30] })
实现函数
def calculate_score(df1, df2): # 初始化Score列为0 df1['Score'] = 0 # 遍历每个需要匹配的变量 for var in ['Age', 'Income', 'Contract Length']: # 提取当前变量的区间规则 var_rules = df2[df2['variable'] == var] # 对df1的当前字段值,匹配对应的Score def get_var_score(val): # 找到满足 LQ <= val <= UQ 的行 match = var_rules[(var_rules['LQ'] <= val) & (val <= var_rules['UQ'])] # 返回对应的Score(假设每个值唯一匹配一个区间) return match['Score'].values[0] # 计算当前变量的得分并累加到总Score df1['Score'] += df1[var].apply(get_var_score) return df1
逻辑说明
- 函数接收两个DataFrame参数,先初始化
Score列为0 - 逐个处理三个目标变量:从DF2中筛选出对应变量的所有区间规则
- 定义辅助函数
get_var_score,输入字段值后找到匹配的区间,返回对应的Score值 - 使用
apply方法为DF1的当前字段每行计算得分,累加到总Score中
测试结果
调用函数并查看结果:
result_df = calculate_score(DF1, DF2) print(result_df)
输出:
Age Income Contract Length Score 0 25 10203 18 30 1 54 23822 12 45 2 33 84823 36 65
验证:
- 第1行:Age=25得5,Income=10203得10,Contract Length=18得15,总和30,符合要求
- 第2行:Age=54匹配区间46.75-54得20,Income=23822匹配10203-28858得10,Contract Length=12匹配12-18得15,总和45
- 第3行:Age=33匹配32.25-39.5得10,Income=84823匹配66168-84823得25,Contract Length=36匹配30-36得30,总和65
内容的提问来源于stack exchange,提问作者tatendamark
相关产品推荐
相关产品推荐

