首页 > 解决方案 > 如何根据行的值 Pandas 数据框查找两个不同的范围

问题描述

我正在尝试使用 pandas 进行有条件的 vlookup。这是我正在使用的数据

n_age_scores

type n     aging_n     mini_n   percent_n
new        <30 days       0       0.5543
new        31-50 days     31      0.6446
new        51-100 days    51      0.3134

e_age_scores

type e           aging_e      mini_e   percent_e
expansion        <30 days       0       0.33543
expansion        31-50 days     31      0.4446
expansion        51-100 days    51      0.6134

数据框

type        age    score
new          33
new          12
expansion    3
new          4
expansion    100

我想要做的是根据行type是新的还是扩展的,使用任一数据框的百分比列填充分数,值百分比的近似匹配。

我如何用熊猫做到这一点?

n_age_scores = aging_score_mapping.iloc[:,0:4] 
e_age_scores = aging_score_mapping.iloc[:,-4:9]


    if df['deal_type'] == 'Expansion':
       df = merge.e_age_scores(df, on='age_score')
       if df['deal_type'] == 'new':
          df = merge.n_age_scores(df, on='age_score')

我不确定如何执行此操作,但我认为我需要循环并与近似匹配合并,并根据类型使用 percent_n 填充 age_score。

熊猫可以做到这一点吗?

标签: pythonpandasnumpy

解决方案


您可以定义自定义函数以从两个数据框中提取数据并将其与apply一起使用。

如果我正确理解了你想要什么,下面的代码应该可以完成这项工作。
我调用age_map了生成的数据框(具有score要填充的列以及从和collector中提取数据的函数。n_age_scorese_age_scores

def collector(row):
    if row['type'] == 'new':
        return n_age_scores.loc[n_age_scores['mini_n'] < row['age']].iloc[-1]['percent_n']
    elif row['type'] == 'expansion':
        return e_age_scores.loc[e_age_scores['mini_e'] < row['age']].iloc[-1]['percent_e']

age_map['score'] = age_map.apply(collector, axis=1)

使用您提供的示例数据框age_map是:

        type  age    score
0        new   33  0.64460
1        new   12  0.55430
2  expansion    3  0.33543
3        new    4  0.55430
4  expansion  100  0.61340

推荐阅读