Python 基于str.contains的数据帧合并
如果来自df2的列值包含来自df1的列值,我将基于这两个数据帧进行合并。我一直在尝试使用str.contains和series.isin。但到目前为止运气不好。下面的例子 df1 df2 合并的数据帧应该是这样的 合并Python 基于str.contains的数据帧合并,python,pandas,dataframe,Python,Pandas,Dataframe,如果来自df2的列值包含来自df1的列值,我将基于这两个数据帧进行合并。我一直在尝试使用str.contains和series.isin。但到目前为止运气不好。下面的例子 df1 df2 合并的数据帧应该是这样的 合并 Domain Visits Ads aaa.com 1 2 bbb 3 4 c
Domain Visits Ads
aaa.com 1 2
bbb 3 4
c.com 3
ddd 5
e.net 6
Thx提前。尝试并预处理df2,以获得与df1相同格式的域:
df2['key'] = df2['Domain'].str.extract('(\w+)\.?')
df_out = df1.merge(df2, left_on='Domain', right_on='key', suffixes=('_x',''), how='outer')
df_out['Domain'] = df_out['Domain'].combine_first(df_out['Domain_x'])
df_out = df_out.drop(['Domain_x','key'], axis=1)
print(df_out)
输出:
Visits Domain Ads
0 1.0 aaa.com 2.0
1 3.0 bbb 4.0
2 5.0 ddd NaN
3 NaN c.com 3.0
4 NaN e.net 6.0
尝试并预处理df2,以获得与df1相同格式的域:
df2['key'] = df2['Domain'].str.extract('(\w+)\.?')
df_out = df1.merge(df2, left_on='Domain', right_on='key', suffixes=('_x',''), how='outer')
df_out['Domain'] = df_out['Domain'].combine_first(df_out['Domain_x'])
df_out = df_out.drop(['Domain_x','key'], axis=1)
print(df_out)
输出:
Visits Domain Ads
0 1.0 aaa.com 2.0
1 3.0 bbb 4.0
2 5.0 ddd NaN
3 NaN c.com 3.0
4 NaN e.net 6.0
设置
我们可以从创建一个新系列开始,该系列是df2中每个域在df1中对应的行,如果存在这样的行:
r = '({})'.format('|'.join(df1.Domain))
merge_df = df2.Domain.str.extract(r, expand=False).fillna(df2.Domain)
我们的合并df现在如下所示:
0 aaa
1 bbb
2 c.com
3 e.net
Name: Domain, dtype: object
现在我们合并。我们需要一个外部合并,合并域列上的第一个数据帧,合并merge_df系列上的第二个数据帧:
因为我们存储了一个单独的系列以进行合并,并且没有修改df2,所以我们在这一步之后就完成了,您有了合并的数据帧。设置
我们可以从创建一个新系列开始,该系列是df2中每个域在df1中对应的行,如果存在这样的行:
r = '({})'.format('|'.join(df1.Domain))
merge_df = df2.Domain.str.extract(r, expand=False).fillna(df2.Domain)
我们的合并df现在如下所示:
0 aaa
1 bbb
2 c.com
3 e.net
Name: Domain, dtype: object
现在我们合并。我们需要一个外部合并,合并域列上的第一个数据帧,合并merge_df系列上的第二个数据帧:
因为我们存储了一个单独的系列以进行合并,并且没有修改df2,所以我们在这一步之后就完成了,您有了合并后的数据帧。您能再次检查您的输出吗?dd不应该在访问栏中有5个,而不是广告吗?另外,c.com的广告中不应该有一个3,而不是访问量吗?你是对的,我会修正它。感谢您捕捉到它。如果df2中的元素不包含任何来自df1的内容,该怎么办?如果df2中的多个元素与df1中的给定元素匹配,该怎么办。该元素仍将存在于mergeDF中。2.太棒了,我还没想过呢。但我认为,如果多个元素匹配,那么访问量和广告的价值应该加起来。@fugledeCan你能仔细检查一下你的输出吗?dd不应该在访问栏中有5个,而不是广告吗?另外,c.com的广告中不应该有一个3,而不是访问量吗?你是对的,我会修正它。感谢您捕捉到它。如果df2中的元素不包含任何来自df1的内容,该怎么办?如果df2中的多个元素与df1中的给定元素匹配,该怎么办。该元素仍将存在于mergeDF中。2.太棒了,我还没想过呢。但我认为,如果多个元素匹配,那么访问量和广告的价值就应该综合起来。@fuglede