仅当特定列至少包含另一列的一个单词时,才从 Dataframe2 合并 Dataframe1 的 Python/Pandas 中的列

问题描述

考虑数据帧:

员工:

Employee    City

Ernest      Tel Aviv
Merry       New York
Mason       Cairo

客户:

Client  Words

Ernest  New vacuum Tel
Mason   Tel Aviv is so pretty
Merry   Halo! I live in the city York

仅当 Employees 列(Clients ) 包含在 CityEmployees 列中。

想要的结果应该如下:

Words

尝试过这样的事情

将熊猫导入为 pd

Clients

但并没有真正归结为某事。

有什么想法吗?

解决方法

  • CityWords 列拆分为列表,然后explode() 生成行
  • 您现在可以merge()获得所需的输出
import pandas as pd
import io

data1 = pd.read_csv(
    io.StringIO("""Employee    City
Ernest      Tel Aviv
Merry       New York
Mason       Cairo"""),sep="\s\s+",engine="python",)

data2 = pd.read_csv(io.StringIO("""Client  Words
Ernest  New vacuum Tel
Mason   Tel Aviv is so pretty
Merry   Halo! I live in the city York"""),)

data1.assign(tokens=data1["City"].str.split(" ")).explode("tokens").merge(
    data2.assign(tokens=data2["Words"].str.split(" ")).explode("tokens"),left_on=["Employee","tokens"],right_on=["Client",).drop(columns="tokens").drop_duplicates()
员工 城市 客户端 单词
0 欧内斯特 特拉维夫 欧内斯特 新真空电话
1 快乐 纽约 快乐 晕!我住在纽约市
,

复杂的连接;

#提取客户词中的最后一个词

 Clients['joinword']=Clients['Words'].str.extract("(\w+$)")

#将其设为 | 分隔的搜索词 or

 s='|'.join(Clients['joinword'].to_list())

#Find s 在员工城市

Employees['joinword']=Employees['City'].str.findall(f'{s}').str[0]

#现在合并如下

 pd.merge(Employees,Clients,right_on=['Client','joinword'],left_on=['Employee',how='inner')

Employee      City joinword  Client                          Words
0   Ernest  Tel Aviv      Tel  Ernest                 New vacuum Tel
1    Merry  New York     York   Merry  Halo! I live in the city York