首页 > 解决方案 > Python & Pandas - 基于字符串搜索合并 csv

问题描述

使用 Python,我正在寻求创建一个脚本来比较两个不同 csv 中的数据。第一个 csvfiledata.csv包含文件路径字符串,其中包含有关用户名和用户 ID 的信息。第二个 csvroster.csv包含被分成不同列的相同字段。我想在文件路径字符串中filedata.csv搜索匹配项roster.csv,然后将列roster.csv写入filedata.csv. 下面是 csv 结构和所需的输出。

filedata.csv

filename
C:\johndoe_0001_paper1.doc
C:\janedoe_0002_paper2.doc
C:\johnsmith_0003_paper3.pdf

roster.csv

first_name, last_name, user_id
john, doe, 0001
jane, doe, 0002
john, smith, 0003

所需的输出filedata.csv

filename, first_name, last_name, user_id
C:\johndoe_0001_paper1.doc, john, doe, 0001
C:\janedoe_0002_paper2.doc, jane, doe, 0002
C:\johnsmith_0003_paper3.pdf, john, smith, 0003

我尝试使用 Pandas 编写以下代码,看看是否可以在字符串中filenames.csv搜索匹配项roster.csv

import pandas as pd

df = pd.read_csv('filenames.csv')
filenames = str(df['filename'])

roster = pd.read_csv('roster.csv')
roster_last_name = str(roster['last_name'])
roster_first_name = str(roster['first_name'])
roster_user_id = str(roster['user_id'])

print(df.loc([filenames]).str.contains([roster_last_name]))

但是得到以下错误:

TypeError: unhashable type: 'list'

同样,我尝试了一些更简单的方法,但没有成功,因为总是返回“False”:

if roster_last_name in filenames:
    print("True")
else:
    print("False")

我确定我错过了一些简单的东西,但不确定如何继续。非常感谢所有建议。

标签: pythonpandascsv

解决方案


filename['user_id'] = filename['filename'].str.extract(r'(\d{4})')
new_df = filename.merge(roster, on='user_id')

此解决方案添加一列,filename即从文件名中提取的四位数 ID(作为字符串),然后合并用户 ID 相同的两个数据帧中的行。

您的解决方案不起作用,因为像这样的表达式str(roster['last_name'])采用一系列并返回一个字符串。

更新:

上述解决方案假定 user_id 列中roster包含字符串。如果它们是整数,请执行以下操作:

filename['user_id'] = filename['filename'].str.extract(r'(\d{4})').astype(int)
new_df = filename.merge(roster, on='user_id')

唯一的区别是.astype(int)

如果这不是我们想要的,请告诉我。


推荐阅读