将列从一个数据帧附加到另一个数据帧,循环中有多个匹配项
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_Col
和 df1_start
在 df2_start
和 df2_end
的范围内,然后添加df1
中 data
列的值。如果有多个匹配项,则 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
我的问题是这个问题的延伸:
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_Col
和 df1_start
在 df2_start
和 df2_end
的范围内,然后添加df1
中 data
列的值。如果有多个匹配项,则 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