繁体   English   中英

Python提取唯一的CSV行

[英]Python to extract unique CSV rows

我正在尝试获取Python中CSV每行的第一次出现。 但是,我面临一个问题。 我的CSV文件如下所示:

1,2,3,a,7,5,y,0
1,2,3,a,3,5,y,8
1,2,3,a,5,3,y,7
1,2,3,d,7,5,n,0
1,2,3,d,3,5,n,8
1,2,3,d,5,3,n,7
2,3,4,f,4,6,y,9
2,3,4,f,5,6,y,9
2,3,4,f,7,3,y,9
2,3,4,e,3,5,n,9
2,3,4,e,0,7,n,9
2,3,4,e,5,8,n,9

我尝试过这种方法,以根据其中一列获取唯一值的首次出现。

def unique():
    rows = list(csv.reader(open('try.csv', 'r'), delimiter=','))
    columns = zip(*rows)
    uniq = set(columns[1])

    indexed = defaultdict(list)

    for x in uniq:
        i = columns[1].index(x)
        indexed[i] = rows[i]

    return indexed

它适用于一组唯一的列值。 然而,

  1. 我想将column [1]和column [6]设置为唯一值。
  2. 棘手的部分是columns [6]始终为y或n。 如果设置了该值,则仅返回前y和n列。 我想获得所有column [1]和column [6]为唯一的列。 对于每个column [2]值,我需要第一次出现y和n行。 对不起,我的描述不好。 所以基本上,我希望我的输出像:
 1,2,3,d,7,5,n,0,a 2,3,4,e,3,5,n,9,f 

您的代码还有一些改进的空间,但是我不想深入地重写它,因为您的代码几乎正确。 “关键”点是您需要复合键 (r[1],r[6])必须是唯一的。 此外,我可以OrderedDict使用OrderedDict进行快速查找,但保留行顺序。

import csv
import collections

def unique():
    rows = list(csv.reader(open('try.csv', 'r'), delimiter=','))
    result = collections.OrderedDict()
    for r in rows:
        key = (r[1],r[6])  ## The pair (r[1],r[6]) must be unique
        if key not in result:
            result[key] = r

    return result.values()

from pprint import pprint
pprint(unique())

生产:

[['1', '2', '3', 'a', '7', '5', 'y', '0'],
 ['1', '2', '3', 'a', '7', '5', 'n', '0'],
 ['2', '3', '4', 'f', '4', '6', 'y', '9'],
 ['2', '3', '4', 'f', '3', '5', 'n', '9']]

这是一个替代实现。

从数据集中读取每一行。 我们使用defaultdict(list)根据每行的两列索引存储所有行。 从数据集中读入一行后,它会基于该行的两列索引键添加到defaultdict

最后,我们浏览defaultdict 我们希望数据集中的第一行与索引匹配,因此我们返回与两列索引相对应的uniq[0]

资源

import csv
from collections import defaultdict
def unique():
    uniq = defaultdict(list)
    for row in csv.reader(open('try.csv', 'r'), delimiter=','):
        uniq[ (row[0],row[6]) ].append(row)

    for idx,row in uniq.iteritems():
        yield row[0]

print list( unique() )

输出

[['2', '3', '4', 'f', '4', '6', 'y', '9'], ['2', '3', '4', 'f', '3', '5', 'n', '9'], ['1', '2', '3', 'a', '7', '5', 'y', '0'], ['1', '2', '3', 'a', '7', '5', 'n', '0']]

这个主题很旧,但是对其他主题可能很有用:如果您在Unix环境中,为什么不调用外部uniq命令呢? 这样,您就不必重新编写此代码,并且可以从可能更好的性能中受益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM