【问题标题】:Compare one column (vector) from one CSV file with two columns (vector and array) from another CSV file using Python 3.8使用 Python 3.8 将一个 CSV 文件中的一列(向量)与另一个 CSV 文件中的两列(向量和数组)进行比较
【发布时间】:2021-05-23 02:15:15
【问题描述】:

我是初学者,正在寻找解决方案。我正在尝试比较两个没有标题的 CSV 文件中的列。第一个有一列,第二个有两列。

File_1.csv:#包含 2k 行随机数。

1 
4
1005
.
.
.
9563

File_2.csv:#包含 28k 行

0      [81,213,574,697,766,1074,...21622]
1      [0,1,4,10,12,13,1005, ...31042]
2      [35,103,85,1023,...]
3      [4,24,108,76,...]
4      []
.
.
.
28280  [0,1,9,10,32,49,56,...]

我想先将 File_1 的列与 File_2 的第一列进行比较,看看它们是否匹配并将匹配值加上 file2 的第二列提取到一个新的 CSV 文件 (output.csv) 删除不匹配的值。例如,

输出.csv:

1      [0,1,4,10,12,13,1005, ...31042]
4      []
.
.
.

其次,我想将 File_1.csv 列(迭代 2k 行)与 output.csv 的第二列(每个数组)进行比较并找到匹配项值并删除那些不匹配的值,我想将这些匹配值保存到 output.csv 文件中,并保留该文件的第一列。例如,4 被删除,因为它在第二列(数组)中没有任何值,因为没有数字可与 File_1 进行比较,但还有其他类似 1 的值确实有一些匹配"

输出.csv:

1      [1,4,1005]
.
.
.

我找到了适用于第一步的代码,但它不保存第二列。我一直在研究如何比较数组,但我没能做到。 这是我目前所拥有的,

import csv
nodelist = []
node_matches = []

with open('File_1.csv', 'r') as f_rand_node:
    csv_f = csv.reader(f_rand_node)

    for row in csv_f:
        nodelist.append(row[0])

set_node = set(nodelist)

with open('File_2.csv', 'r') as f_tbl:

    with open('output.csv', 'w') as f_out:

        csv_f = csv.reader(f_tbl)

        for row in csv_f:

            set_row = set(' '.join(row).split(' ')) 
           
            if set_row.intersection(set_node):
                node_match = list(set_row.intersection(set_node))[0]
            
                f_out.write(node_match + '\n')

感谢您的帮助。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我建议在这种情况下使用pandas

    文件_1.csv:

    1
    4
    1005
    9563
    

    文件_2.csv:

    0      [81,213,574,697,766,1074]
    1      [0,1,4,10,12,13,1005,31042]
    2      [35,103,85,1023]
    3      [4,24,108,76]
    4      []
    5      [0,1,9,10,32,49,56]
    

    代码:

    import pandas as pd
    import csv
    
    
    file1 = pd.read_csv('File_1.csv', header=None)
    file1.columns=['number']
    file2 = pd.read_csv('File_2.csv', header=None, delim_whitespace=True, index_col=0)
    file2.columns = ['data']
    
    df = file2[file2.index.isin(file1['number'].tolist())]  # first step
    df = df[df['data'] != '[]']  # second step
    
    df.to_csv('output.csv', header=None, sep='\t', quoting=csv.QUOTE_NONE)
    

    输出.csv:

    1   [0,1,4,10,12,13,1005,31042]
    

    【讨论】:

      【解决方案2】:

      使用 pandas DataFrames 让整个事情变得容易得多:

      import pandas as pd
      
      #Read the files into two dataFrames
      df1= pd.read_csv("File_1.csv")
      df2= pd.read_csv("File_2.csv")
      
      df2.set_index("Column 0")
      df2= df2.filter(items = df1)
      index= df1.values()
      df2 = df2.applymap(lambda x: set(x).intersection(index))
      df.to_csv("output.csv")
      

      这应该可以解决问题,非常简单。

      【讨论】:

        猜你喜欢
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 1970-01-01
        • 2018-08-22
        • 2021-06-08
        相关资源
        最近更新 更多