我有一个csv文件,其中每行看起来像:
OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3'), ('key4', 'value4'), ('key5', 'value5')])
我想比较相邻行上的两个键以找到匹配项,并将这些行(dicts(存储到列表中。
#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中引用一行。我知道枚举会为每一行提供一个索引号,但我不清楚如何或是否可以将其用作引用。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开始启动csc_list,其他参数表示从1开始csv_list
,所以你将有列表的0 1, 1 2,2 3
迭代。
根据定义,字典中的键是唯一的。因此,比较两个"行"的键不太可能奏效。此解决方案使用熊猫。
假设"Sample_data.csv"包含以下行(以"keys"作为第一列(:
密钥、值
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 |