为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Pandas 查找两个 csv 之间的部分字符串匹配,并使用第一个 csv 的索引输出匹配结果

使用 Pandas 查找两个 csv 之间的部分字符串匹配,并使用第一个 csv 的索引输出匹配结果

四季花海 2023-05-23 16:52:37
我想比较两个 CSV 之间的两列,找到部分字符串匹配项,然后将匹配行中的所有数据(包括列内的等效项)附加到第一个 CSV 中的正确索引处,然后在第三个 CSV 中输出编译后的匹配项,而无需编辑前两个 CSV 中的任何一个。第一个 CSV 中的所有行都必须出现在第三个中,无论是否找到匹配项,但只有第二个 CSV 中的匹配行。例如:CSV_1                               CSV_2Name     City     Date              Name_of_thing     City_of_Origin     TimeExamp.   Bton     7/11              huh, inc.         Lton, AMERICA  7/10/2020 00:00Nomatch  Cton     10/10             THE EXAMPLE, LLC  Bton, USA        7/11/2020 00:00会显示为CSV_3Name     City     Date    Name_of_thing     City_of_Origin     TimeExamp.   Bton     7/11    THE EXAMPLE, LLC  Bton, USA          7/11/2020 00:00Nomatch  Cton     10/10我早些时候在这里发帖询问模糊匹配方法(Record linking two large CSVs in Python?),但解决方案的时间效率非常低,所以我希望简单的正则表达式搜索就足够了。这些文件都非常大而且长度不一样,所以我想知道是否有一种解决方案可以有效地将 CSV_1 中的所有条目与 CSV_2 中的条目进行比较。不幸的是,项目的限制不允许我将 CSV 加载到数据库中,这会使这变得容易得多,所以我需要完全依赖 Pandas。
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

只需花一点时间就可以使日期和城市保持一致。然后就是简单的左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"""), sep="\s\s+", 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


查看完整回答
反对 回复 2023-05-23
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信