python - 如何根据行的值 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。
熊猫可以做到这一点吗?
解决方案
您可以定义自定义函数以从两个数据框中提取数据并将其与apply一起使用。
如果我正确理解了你想要什么,下面的代码应该可以完成这项工作。
我调用age_map
了生成的数据框(具有score
要填充的列以及从和collector
中提取数据的函数。n_age_scores
e_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
推荐阅读
- java - 按下回车键时,Spring 和 Vue.js 不支持请求方法“POST”
- c++ - 将向量转换为向量时的段错误
> - python - 检查用户是否在不和谐的 vc 中进行流式传输
- python-3.x - discord.py 如何在嵌入中编辑图像?
- python - 在 Seaborn 中绘制分类数据
- mysql - Mysql Inner Join 和 Group By 重复行
- docker - Nginx 反向代理到 Docker 502 错误网关
- javascript - 显示部分时如何在重新加载页面后显示内容?
- listview - ListView“隐藏”子元素
- swift - 如何在初始化时捕获字典错误?