基于Python中的几个查找表创建一个新列

基于Python中的几个查找表创建一个新列,python,pandas,Python,Pandas,我有一个大熊猫数据框(df_orig)和几个查找表(也是数据框),它们对应于df_orig中的每个段 以下是df_orig的一小部分: segment score1 score2 B3 0 700 B1 0 120 B1 400 950 B1 100 220 B1 200 320 B1 650 340 B5 300 400 B5 0 320

我有一个大熊猫数据框(
df_orig
)和几个查找表(也是数据框),它们对应于
df_orig
中的每个段

以下是
df_orig
的一小部分:

segment score1 score2 
 B3         0   700
 B1         0   120
 B1       400   950
 B1       100   220
 B1       200   320
 B1       650   340
 B5       300   400
 B5         0   320
 B1         0   240
 B1       100   360
 B1       940   700
 B3       100   340
这里有一个完整的B5段查找表,称为
阈值\u B5
(大数据集中的每个段都有一个查找表):

我想在我的大型数据集中创建一个与此SQL逻辑相关的新列:

段为'B5'时的情况,然后
当分数1=990且分数2>=220时,则为1
当分数1=980且分数2>=280时,则为1
.
.
.
其他0
当段='B1'时的情况,则
.
.
.
否则0结束作为指示器
我能够使用基于以下解决方案的循环获得正确的输出:

然而,我需要另一个循环来为每个段运行这个过程,然后将所有结果数据帧追加到一起,这有点混乱。此外,虽然我现在只有三个片段(B1、B3、B5),但我将来会有20多个片段


有没有一种方法可以更简洁地做到这一点,而且最好不使用循环?有人警告我,数据帧上的循环往往很慢,考虑到我的数据集的大小,我认为速度很重要。

如果您同意提前对数据帧进行排序,那么您可以用新的循环示例替换循环示例:

这就是我得到的:

  segment  score1  score2  indicator
0      B5       0     320          0
1      B5     300     400          1
如果需要原始顺序,则将索引保存在
df_orig
的一个新列中,然后按该顺序使用最终数据帧


,因此您可以为每个阈值设置
segment
列,然后调用:

pd.merge_asof(df_orig, thresholds, on='score2', by=['segment', 'score1'])

哇!这真是一个非常有用的新功能!谢谢你!为了确保我理解,我仍然需要一个循环来运行
df_orig['segment'].unique()中每个段的代码。给定多个by参数的限制,unique()
,对吗?@D.Ross这是正确的。现在,您在独特段上的外环将保持不变。@chrisaycock真棒。我会接受你的回答,只要我今晚从公司网络升级到0.19.0。
# query
df_b5 = df_orig.query('segment == "B5"')

# sort ahead of time
df_b5.sort_values('score2', inplace=True)
threshold_b5.sort_values('score2', inplace=True)

# set the default indicator as 1
threshold_b5['indicator'] = 1

# join the tables
df = pd.merge_asof(df_b5, threshold_b5, on='score2', by='score1')

# fill missing indicators as 0
df.indicator = np.int64(df.indicator.fillna(0.0))
  segment  score1  score2  indicator
0      B5       0     320          0
1      B5     300     400          1
pd.merge_asof(df_orig, thresholds, on='score2', by=['segment', 'score1'])