Pandas在字符串上左连接包含

kyxcudwk  于 2022-10-07  发布在  Spark
关注(0)|答案(2)|浏览(147)

我如何使用Pandas Dataframes实现这个Pyspark代码?

result = df.join(df2, df.name.contains(df2.text), "left")

DF

DF2

结果

P.D:df和df2为大数据表

非常提前感谢您

vxf3dgd4

vxf3dgd41#

考虑到OPS增加了可伸缩性的约束,我用lambda和helper函数解决了这个问题

import pandas as pd

def helper(str1, str2):
    out = 'null'
    if str2 in str1:
        out = str2
    return out

names = ['auriel', 'michael', 'karl']
text = ['iel', 'ael', 'nov']

df = pd.DataFrame(names, columns=['name'])
df2 = pd.DataFrame(text, columns=['text'])

result = pd.DataFrame(zip(df.name, df2.text), columns=['name', 'text'])
result['text'] = result.apply(lambda x: helper(x[0], x[1]), axis=1)

print(result)

      name  text
0   auriel   iel
1  michael   ael
2     karl  null
lmvvr0a8

lmvvr0a82#

星星之火

我不确定文本是否始终是最后三个字符。因此,我使用文本列对名称进行切片。如果它总是最后三个字符,那么我们可以简化它。

new = (df.withColumn('text',regexp_extract('name', ('|').join(df1.select('text').rdd.flatMap(lambda x:x).collect()), 0))#Use df1 column to slice name and create join column

           .join(df1, how='left', on='text')#Join
          ).show()

Pandas

new =(df.assign(text=df['name'].str.extract(fr"({('|').join(df1['text'].to_list())})")#Extract df1 text from name into new column
       ).merge(df1, how='left', on='text')#merge
     )

     name text
0   Auriel  iel
1  Michael  ael
2     Karl  NaN

相关问题