问题描述
考虑数据帧:
员工:
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
) 包含在 City
的 Employees
列中。
想要的结果应该如下:
Words
尝试过这样的事情
将熊猫导入为 pd
Clients
但并没有真正归结为某事。
有什么想法吗?
解决方法
- 将City 和Words 列拆分为列表,然后
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