【问题标题】:python csv: getting subsetpython csv:获取子集
【发布时间】:2011-03-21 08:40:47
【问题描述】:

这是我 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

【问题讨论】:

  • 很好。究竟是什么问题?
  • 如果要过滤选定的行,则必须编写一些代码。请发布您编写的代码。提示:在您的代码中包含 if 语句。另一个提示:这不是www.do_my_homework_for_me.com
  • 这不是一个“教我你的道德”论坛,也不是一个“我们只会在看起来不是家庭作业的情况下回答你的问题”论坛。
  • 在任何语言中,最小复杂度低内存使用解决方案的概述是:(1)读取文件一次,构建一个表,将名称映射到出现计数,例如{'alex': 4, 'harry': 2}。 (2) 再次读取文件,只写入名称出现4次或以上的记录。试试看,如果有问题再问。
  • “这不是一个“教我道德”的论坛吗?什么?你没有做任何工作,要求我们为你做所有的工作。我们对此感到不满。我们将回答具体的问题。我们不会为你做你的工作。我们不是志愿程序员。我们有工作。这不是一个“道德”问题。这是一个“剥削”问题。我们不想被你利用。

标签: python csv


【解决方案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 文件就可以了。

【讨论】:

  • 第一部分似乎选择了所有以数字 4 结尾的记录,后跟可选的空格和/或制表符。 OP 似乎希望记录至少出现 4 次的名称。您的解决方案意外产生与 OP 所需输出相同的输出。添加另一条记录tom pqrs 4;您的解决方案会打印出来,这与 OP 的要求相反。
【解决方案2】:

显然,在您查看所有行之前,您无法确定哪些行是有趣的(因为最后一行可能是将一些计数从 3 变为 4 的那一行,从而使一些以前看到的行变得有趣,例如;-) .因此,除非您的 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

当然,这会将每个有趣的行打印为粗略的列表(在项目周围加上方括号和引号),但您可以轻松地以任何您喜欢的方式对其进行格式化。

【讨论】:

  • @I___,是的,会好的。一台典型的现代机器有不少于 GB(一千兆),所以它有足够的空间来读入和处理你的七十兆文件(即使数据在内存中占用的空间通常比它在磁盘)。
  • @I__:试试看;它只有 10 行代码,如果内存不足,它不会破坏您的计算机……如果确实如此,那么您可以编写一些代码来实现我在对您的非问题的评论中给您的大纲。
  • 嗨,alex,这对我不起作用,它返回了错误的子集
  • @I__,如果你的分隔符,看起来,是一个制表符(而不是一个逗号,默认的分隔符,逗号分隔的变量文件,又名 CSV 文件,命名),你当然有让您的读者略有不同,例如data = list(csv.reader(f, delimiter='\t')) 而不是我构建它的默认方式。除了这个明显的问题之外,应用于您的示例输入文件的代码给出了预期的输出。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 2011-05-10
  • 2019-05-18
  • 2019-02-17
  • 2020-01-04
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多