【问题标题】:How to verify that two different .csv files column ids match with python?如何验证两个不同的 .csv 文件列 ID 是否与 python 匹配?
【发布时间】:2015-04-30 14:47:09
【问题描述】:

我有两个不同的.csv 文件,但它们有相同的id 列。

file_1.csv:
id, column1, column2
4543DFGD_werwe_23, string
4546476FGH34_wee_24, string
....
45sd234_w32rwe_2342342, string

另一个:

file_1.csv:
id, column3, column4
4543DFGD_werwe_23, bla bla bla
4546476FGH34_wee_24, bla bla bla
....
45sd234_w32rwe_2342342, bla bla bla

如何验证这两列是否匹配(具有相同的 id)或与 csv 模块或 pandas 相同?

【问题讨论】:

    标签: python python-2.7 csv pandas


    【解决方案1】:

    加载后可以在id列调用equals

    df['id'].equals(df1['id'])
    

    这将返回False 中的True,如果它们完全相同,长度和值相同且顺序相同

    In [3]:
    
    df = pd.DataFrame({'id':np.arange(10)})
    df1 = pd.DataFrame({'id':np.arange(10)})
    df.id.equals(df1.id)
    Out[3]:
    True
    
    In [7]:
    
    df = pd.DataFrame({'id':np.arange(10)})
    df1 = pd.DataFrame({'id':[0,1,1,3,4,5,6,7,8,9]})
    df.id.equals(df1.id)
    Out[7]:
    False
    In [8]:
    
    df.id == df1.id
    Out[8]:
    0     True
    1     True
    2    False
    3     True
    4     True
    5     True
    6     True
    7     True
    8     True
    9     True
    Name: id, dtype: bool
    

    要加载 csvs:

    df = pd.read_csv('file_1.csv')
    df1 = pd.read_csv('file_2.csv') # I'm assuming your real other csv is not the same name as file_1.csv
    

    那么你就可以进行和上面一样的比较了:

    df.id.equals(df1.id)
    

    如果您只想比较 id 列,您可以指定仅加载该列:

    df = pd.read_csv('file_1.csv', usecols=['id'])
    df1 = pd.read_csv('file_2.csv', usecols=['id'])
    

    【讨论】:

    • 哇.. 不错。谢谢您的帮助。如何将'id':np.arange(10) 更改为大文件的长度?。
    • 你有点糊涂了,我的代码显示了示例数据,我将更新以显示如何在 pandas 中加载 csv 并执行相同的比较
    • 我可以告诉你,pandas csv 模块在加载 csv 文件时速度快如闪电,比 python 标准 csv 模块快,见链接:wesmckinney.com/blog/…
    • @ml_guy 不,忽略 np.arange 部分,加载 csv 后直接执行 df.id.equals(df1.id) 无需构建新的 dfs
    • pd.set_option('display.max_rows=-1')
    【解决方案2】:

    通过 csv 模块:

    1. 打开两个文件。
    2. 通过csv reader()方法读取文件。
    3. 创建字典,因为行中的第一项是键,值是行。
    4. 使用setintersection方法从字典中获取相同的键。
    5. 打印结果。

    代码:

    import csv
    
    file1 =  '/home/vivek/Desktop/stackoverflow/fil1.csv'
    file2 =  '/home/vivek/Desktop/stackoverflow/fil2.csv'
    
    with open(file1) as fp1:
        root = csv.reader(fp1)
        rows1 = {}
        for i in root:
            rows1[i[0]]=i
        if "id" in rows1:
            del rows1["id"]
    
    with open(file2) as fp1:
        root = csv.reader(fp1)
        rows2 = {}
        for i in root:
            rows2[i[0]]=i
        if "id" in rows2:
            del rows2["id"]
    
    result = set(rows1.keys()).intersection(set(rows2.keys()))
    
    print "Same Id :", list(result)
    

    输出:

    vivek@vivek:~/Desktop/stackoverflow$ python 27.py
    Same Id : ['4546476FGH34_wee_24', '4543DFGD_werwe_23', '45sd234_w32rwe_2342342']
    

    【讨论】:

    • 太棒了!感谢您的帮助!
    • 欢迎。我也在看 pandas 的实现
    • 感谢您的帮助,但我得到了这个:Same Id : [] 也许我做错了什么,我该如何解决?
    • 将您的 py 文件与电子邮件中的输入文件一起传递给我 - vivekbsable@gmail.com
    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 2018-04-07
    • 2011-02-05
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多