Python Pandas DataFrame str.contains() 合并 if

6

我希望将下面两个数据框的行合并,当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

为此,我可以使用“str contains”来识别DF2.Test1字符串中包含的DF1.Test1子字符串。
输入:
for i in DF1.Test1:

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

print(ok)

输出:

enter image description here

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

输出:

enter image description here

为此,我尝试使用“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)

感谢您的想法 :)
2个回答

4

由于我的声誉不够高,我无法回复jezrael的评论。但我将他的答案更改为针对非大写文本进行合并的函数。

def str_merge(part_string_df,full_string_df, merge_column):
    merge_column_lower = 'merge_column_lower'
    part_string_df[merge_column_lower] = part_string_df[merge_column].str.lower()
    full_string_df[merge_column_lower] = full_string_df[merge_column].str.lower()   
    pat = '|'.join(r"{}".format(x) for x in part_string_df[merge_column_lower])
    full_string_df['Test3'] = full_string_df[merge_column_lower].str.extract('('+ pat + ')', expand=True)
    DF = pd.merge(part_string_df, full_string_df, left_on= merge_column_lower, right_on='Test3').drop([merge_column_lower + '_x',merge_column_lower + '_y','Test3'],axis=1)
    return DF

使用示例:

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

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

print(str_merge(DF1,DF2, 'Test1'))
  Test1_x  Test2_x Test1_y  Test2_y
0       B        2      bA        2
1       C        3     cCc        3

这行代码的作用是什么?pat = '|'.join(r"{}".format(x) for x in part_string_df[merge_column_lower]) - Regressor

2

我相信你需要将 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

详情:

print (DF2)
  Test1  Test2 Test3
0    ee      1   NaN
1    bA      2     A
2   cCc      3     C
3     D      4   NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接