python - 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")
我确定我错过了一些简单的东西,但不确定如何继续。非常感谢所有建议。
解决方案
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)
。
如果这不是我们想要的,请告诉我。
推荐阅读
- bundling-and-minification - 在 ABP 中捆绑和缩小 MVC 项目以进行生产
- python - Python 提取可量化的文本(数字)
- windows - Adobe Animate 停止在 Windows 10 1803 更新上工作
- node.js - Angular 不在请求标头中设置令牌
- automation - 如何使用邮递员读取和断言来自 CSV 的响应
- featuretools - 如何将深度特征合成应用于单个表
- ios - 无线安装时不显示 iPhone 企业应用程序图标
- javascript - jQuery 在下拉菜单上显示 DIV - 在选择之前显示第一个 DIV
- javascript - 如果未选中,如何验证此选择选项?
- ios - Unwind segue 从视图中删除了原始 VC,为什么?