Python Pandas DataFrame str 包含合并 if

Xav*_*Dou 6 python merge dataframe pandas

当DF2的 Test1 列中的字符串包含DF1的 Test1 列的子字符串时,我想合并下面两个数据帧的行。

DF1 = pd.DataFrame({'Test1':list('ABC'),
                   'Test2':[1,2,3]})

print (DF1)
  Test1  Test2
0     A      1
1     B      2
2     C      3

DF2 = pd.DataFrame({'Test1':['ee','bA','cCc','D'],
                   'Test2':[1,2,3,4]})

print (DF2)
  Test1  Test2
0    ee      1
1    bA      2
2   cCc      3
3     D      4
Run Code Online (Sandbox Code Playgroud)

为此,我能够使用“str contains”来识别 DF2.Test1 字符串中可用的 DF1.Test1 子字符串

输入:

for i in DF1.Test1:

ok = DF2[Df2.Test1.str.contains(i)]

print(ok)
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

现在,我想在输出中添加与 Test2 的字符串匹配的 Test1 子字符串的合并

输出:

在此输入图像描述

为此,我尝试使用“pd.merge”和“if”,但我还无法找到正确的代码..您有建议吗?

for i in DF1.Test1:

if DF2.Test1.str.contains(i) == 'True':

    ok = pd.merge(DF1, DF2, on= ['Test1'[i]], how='outer') 

    print(ok)
Run Code Online (Sandbox Code Playgroud)

谢谢你的想法:)

jez*_*ael 3

我相信您需要extract新列的值,然后merge最后删除辅助列Test3

pat = '|'.join(r"{}".format(x) for x in DF1.Test1)
DF2['Test3'] = DF2.Test1.str.extract('('+ pat + ')', expand=False)
DF = pd.merge(DF1, DF2, left_on= 'Test1', right_on='Test3').drop('Test3', axis=1)
print (DF)
  Test1_x  Test2_x Test1_y  Test2_y
0       A        1      bA        2
1       C        3     cCc        3
Run Code Online (Sandbox Code Playgroud)

细节

print (DF2)
  Test1  Test2 Test3
0    ee      1   NaN
1    bA      2     A
2   cCc      3     C
3     D      4   NaN
Run Code Online (Sandbox Code Playgroud)