如何解决使用熊猫查找两个csv之间的部分字符串匹配,并使用第一个csv的索引输出匹配的结果
我想比较两个CSV之间的两列,找到部分字符串匹配项,然后将匹配行中的所有数据(包括列中的等效项)附加到第一个CSV中的正确索引处,然后在第三个CSV中输出已编译的匹配项CSV,无需编辑前两个CSV之一。无论是否找到匹配项,第一个CSV文件中的所有行都必须出现在第三个CSV文件中,而仅显示第二个CSV文件中的匹配行。例如:
CSV_1 CSV_2
Name City Date Name_of_thing City_of_Origin Time
Examp. Bton 7/11 huh,inc. Lton,AMERICA 7/10/2020 00:00
Nomatch Cton 10/10 THE EXAMPLE,LLC Bton,USA 7/11/2020 00:00
显示为
CSV_3
Name City Date Name_of_thing City_of_Origin Time
Examp. Bton 7/11 THE EXAMPLE,USA 7/11/2020 00:00
Nomatch Cton 10/10
我在这里早些时候发布了关于模糊匹配方法(Record linking two large CSVs in Python?)的问题,但是该解决方案最终导致时间效率很低,因此我希望简单的正则表达式搜索就足够了。这些文件都很大,而且长度不一样,所以我想知道是否有一种解决方案,可以有效地将CSV_1中的所有条目与CSV_2中的所有条目进行比较。
不幸的是,该项目的约束不允许我将CSV加载到数据库中,这将使此操作变得更加容易,因此我需要完全依赖Pandas。
谢谢!
解决方法
只需一点时间就可以使日期和城市保持一致。然后是一个简单的左merge()
import pandas as pd
import io
import datetime as dt
CSV_1 = pd.read_csv(io.StringIO(
"""Name City Date
Examp. Bton 7/11
Nomatch Cton 10/10"""),sep="\s\s+",engine="python")
CSV_2 = pd.read_csv(io.StringIO(
"""Name_of_thing City_of_Origin Time
huh,inc. Lton,AMERICA 7/10/2020 00:00
THE EXAMPLE,LLC Bton,USA 7/11/2020 00:00"""),engine="python")
# need to make dates consistent and joinable
# need to pull city out of City_of_origin
CSV_3 = CSV_1.assign(
datekey=pd.to_datetime(CSV_1["Date"]+f"/{dt.date.today().year}")
).merge(
CSV_2.assign(
datekey=pd.to_datetime(CSV_2["Time"]),City=lambda dfa: dfa["City_of_Origin"].str.extract("([A-Za-z]*)")
),on=["datekey","City"],how="left"
).drop(columns="datekey")
print(CSV_3.to_string())
输出
Name City Date Name_of_thing City_of_Origin Time
0 Examp. Bton 7/11 THE EXAMPLE,LLC Bton,USA 7/11/2020 00:00
1 Nomatch Cton 10/10 NaN NaN NaN
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。