将列从一个数据帧附加到另一个数据帧,循环中有多个匹配项

Appending column from one dataframe to another dataframe with multiple matches in loop

我的问题是这个问题的延伸:

df1

    df1_Col     df1_start
0   A1          1200        
1   B2          4000        
2   B2          2500       

df2

    df2_Col     df2_start   df2_end       data
0   A1          1000        2000          DATA_A1
1   A1          900         1500          DATA_A1_A1
**2   A1          2000        3000          DATA_A1_A1_A1**
2   B1          2000        3000          DATA_B1
3   B2          2000        3000          DATA_B2

输出:

    df1_Col     df1_start     data
0   A1          1200          DATA_A1;DATA_A1_A1
1   B2          4000          
2   B2          2500          DATA_B2

我正在比较 df1_Col 的值以匹配 df2_Coldf1_startdf2_startdf2_end 的范围内,然后添加df1data 列的值。如果有多个匹配项,则 data 可以与任何分隔符结合使用,例如 ';'。

代码如下:

for v,ch in zip(df1.df1_start, df1.df1_Col):
        df3 = df2[(df2['df2_start'] < v) & (df2['df2_end'] > v) & (df2['df2_Col'] ==ch)]
        data = df3['data']
        df1['data'] = data

因为文件很大,所以使用了循环。

编辑:

期待您的帮助。

IIUC:

尝试通过 merge()+groupby()+agg():

在 df1 上左合并然后检查 'df1_start' 是否落在 'df2_start' 和 'df2_end' 之间并创建列 'data' 并将其值设置为等于 None.Then 我们在 ['df1_Col','df1_start'] 上分组并通过删除 None:

加入由 ';' 分隔的 'date' 的值
out=df1.merge(df2,left_on='df1_Col',right_on='df2_Col',how='left',sort=True)
out.loc[~out['df1_start'].between(out['df2_start'], out['df2_end']), 'data'] = None
out=out.groupby(['df1_Col','df1_start'],as_index=False,sort=False)['data'].agg(lambda x:';'.join(x.dropna()))

out的输出:

   df1_Col  df1_start       data
0   A1          1200        DATA_A1;DATA_A1_A1
1   B2          4000    
2   B2          2500        DATA_B2