Python CSV 文件行比较

问题描述

我有一个 csv 文件,其中每一行看起来像:

OrderedDict([('key1','value1'),('key2','value2'),('key3','value3'),('key4','value4'),('key5','value5')]) 

我想比较相邻行上的两个键以查找匹配项并将这些行(字典)存储到列表中。

#if (key1 and key2) in row[i+1] == row[i]
            #append row[i] and row[i+1] to a new match list; becomes a list of dicts
#else go to next row

我正在努力理解如何在 python 中引用一行。我知道 enumerate 会为我提供每一行的索引号,但我不清楚如何或是否可以将其用作参考。 Itertools 似乎会有所帮助,但不确定如何应用它。

解决方法

我假设你的 csv 文件就像你提到的那样

key1,key2,...
val11,val12,..
val21,val22,..

现在编码如果

  with open('test.csv','r') as f:
        csv_lst = list(csv.DictReader(f))  # if your csv is large than this can be problem

        for first_row,next_row in zip(csv_lst,csv_lst[1:]):
            print("Now you have both row with dictionary you can apply your logic ")

python 并行迭代的方法是使用 zip,所以我转换了列表中的所有 csv 数据,然后 zip(csv_list,csv_list[1:]) 第一个参数表示从 0 开始,其他参数表示从 csv_list 开始,从 1 开始所以你将有 0 1,1 2,2 3 次列表迭代。

,

根据定义,字典中的键是唯一的。因此,比较 2 个“行”的键不太可能奏效。此解决方案使用熊猫。

假设“Sample_data.csv”包含这些行(“键”作为第一列):

键、值

A,1

B,2

C,3

C,33

D,4

E,5

E,55

import pandas as pd
data1 = pd.read_table('sample_data.csv',sep=',')  # imports data into dataframe
outdata = (data1[['keys']]==data1[['keys']].shift()).any(axis=1)   # bool of rows to capture
data2 = data1.loc[outdata | outdata.shift(-1),]   # captured rows and one before it,includes all columns
data2

输出:

索引 价值观
2 C 3
3 C 33
5 E 5
6 E 55