python csv:获取子集

-1 投票
2 回答
3169 浏览
提问于 2025-04-16 01:52

这是我CSV文件的一部分:

alex    123f    1
harry   fwef    2
alex    sef 3
alex    gsdf    4
alex    wf35    6
harry   sdfsdf  3

我想要从这些数据中找出第一列(比如harry和alex)出现次数至少为4的那些数据。所以我希望得到的结果是:

alex    123f    1
alex    sef 3
alex    gsdf    4
alex    wf35    6

2 个回答

1

如果Python不是必须的

$ gawk '{b[$1]++;c[++d,$1]=$0}END{for(i in b){if(b[i]>=4){for(j=1;j<=d;j++){print c[j,i]}}}}' file

而且,70MB的文件是可以的。

5

很明显,在你看到所有行之前,无法决定哪些行是有趣的(因为最后一行可能会把某个计数从三变成四,从而让之前看到的某些行变得有趣,比如说;-)。所以,除非你的CSV文件大得惊人,否则先把它全部加载到内存中,作为一个列表……:

import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))

然后,进行计数——Python 2.7有更好的方法,但假设你和我们大多数人一样,还是在用2.6……:

import collections
counter = collections.defaultdict(int)
for row in data:
    counter[row[0]] += 1

最后进行选择循环……:

for row in data:
    if counter[row[0]] >= 4:
        print row

当然,这样会把每一行有趣的内容打印出来,格式大概是一个粗糙的列表(里面有方括号和引号),不过你可以很容易地把它格式化成你喜欢的任何样子。

撰写回答