首页 > 解决方案 > 如何使用 python pandas 比较来自两个不同 csv 的单元格值

问题描述

我有两个 csv 文件,它们具有相同的列(文件名和 MD5),但是,值在不同的行中(csv1 中的文件名在第 2 行(第 1 行是标题)但是,csv2 中的相同文件名可能在第 5 行.

我尝试了将“如何”设置为:右、左、内、外的“合并”模块;结果添加了额外的行和列。我还尝试了“isin”模块。

matchfiles = (df1.Filename.isin(df2.Filename)

if (df1[['Filename','MD5']]) == (df2[['Filename','MD5']]):
    print(df1[['Filename','MD5']])

我希望输出打印带有匹配“MD5”的“文件名”。

错误是:

TypeError: unsupported operand type(s) for &: 'str' and 'bool' 

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

数据集 1:
文件名 MD5

I417122 - KP -pst 125e46b4477934fa7495f
I417122 - KP - xml eee4acefced33e6595a32
J944737 - DJ gif f52483135c9e8f6fb2680
J944737 - DJ txt c1b76990e2e19a7eb2332
J944737 - DJ doc b1aa2e981d8c04860810
J944737 - DJ docx 55b325a7ef73ba8a0e2f9
J944737 - JD.zip 47fcccba65018d88a3c7e

数据集 2:
文件名 MD5

I417122 - KP -pst 125e46b4477934fa7495f
I417122 - KP - xml 47fcccba65018d88a3c7e
J944737 - DJ gif f52483135c9e8f6fb2680
J944737 - DJ txt c1b76990e2e19a7eb2856
J944737 - DJ doc eee4acefced33e6595a32
J944737 - DJ docx 55b325a7ef73ba8a0e2f9
J944737 - JD.zip 47fcccba65018d88a3c7e

预期结果: 文件名 MD5

I417122 - KP -pst 125e46b4477934fa7495f
J944737 - DJ gif f52483135c9e8f6fb2680
J944737 - DJ doc eee4acefced33e6595a32
J944737 - DJ docx 55b325a7ef73ba8a0e2f9
J944737 - JD.zip 47fcccba65018d88a3c7e

标签: pythonpandascsv

解决方案


1如果来自 csv1 的文件名在 csv2 中,则这将返回一个两列数据框,0否则。

matching_df = df1.assign(Indf2=df1.Filename.isin(df2.Filename).astype(int))

然后您可以删除第二列为零的所有行,然后根据以下内容合并Filename

matching_df = matching_df[matching_df.Indf2 == 1]
final_df = matching_df.merge(df1, how="left", on="Filename")
final_df = final_df.drop(columns=["Filename_y", "Indf2"])
print(final_df)

推荐阅读