【问题标题】:How to get statistics on a large text file of data如何获取大型文本数据文件的统计信息
【发布时间】:2015-07-22 12:42:04
【问题描述】:

我有一组大型(~100,000,000 行)文本文件,格式如下:

    0.088293 1.3218e-32 2.886e-07 2.378e-02        21617        28702
    0.111662 1.1543e-32 3.649e-07 1.942e-02        93804        95906
    0.137970 1.2489e-32 4.509e-07 1.917e-02        89732        99938
    0.149389 8.0725e-32 4.882e-07 2.039e-02        71615        69733
    ...

我想找出第 2 列的平均值和总和,以及第 3 列和第 4 列的最大值和最小值,以及总行数。如何使用 NumPy 有效地做到这一点?由于它们的大小,loadtxtgenfromtxt 不好(需要很长时间才能执行),因为它们试图将整个文件读入内存。相比之下,像awk这样的Unix工具:

awk '{ total += $2 } END { print total/NR }' <filename>

在合理的时间内工作。 Python/NumPy 可以为这么大的文件完成awk 的工作吗?

【问题讨论】:

  • 所以你只是在寻找一个 numpy 的答案?这个技术我不知道,但是awk可以做的很好
  • 我愿意接受awk 的回答,如果我可以在文件的一次传递中获得其他统计信息。我不太了解awk
  • 那么它也将有助于显示所需的输出应该是什么样子
  • 我不太担心精确的输出格式:单行上的空格分隔值或单独行上的 &lt;key&gt; = &lt;val&gt; 对都可以。

标签: python numpy awk bigdata


【解决方案1】:

你可以这样说:

awk '{  total2 += $2
        for (i=2;i<=3;i++) {
            max[i]=(length(max[i]) && max[i]>$i)?max[i]:$i
            min[i]=(length(min[i]) && min[i]<$i)?min[i]:$i
        }
     } END {
           print "items", "average2", "min2", "min3", "max2", "max3"
           print NR, total2/NR, min[2], min[3], max[2], max[3]
     }' file

测试

根据您给定的输入:

$ awk '{total2 += $2; for (i=2;i<=3;i++) {max[i]=(length(max[i]) && max[i]>$i)?max[i]:$i; min[i]=((length(min[i]) && min[i]<$i)?min[i]:$i)}} END {print "items", "average2", "min2", "min3", "max2", "max3"; print NR, total2/NR, min[2], min[3], max[2], max[3]}' a | column -t
items  average2     min2        min3       max2        max3
4      2.94938e-32  1.1543e-32  2.886e-07  8.0725e-32  4.882e-07

【讨论】:

  • 可能想要检查 max[i] 包含的数据是否为 ​​0,然后它将任何负数计为更大。
  • 没错,虽然我已经在做max[i]=(max[i] &amp;&amp; max[i]&gt;$i)?max[i]:$i。还不够吗?
  • 不,假设一行有 -1,现在是 max[i],下一行是零,max[i] 现在是 0,现在如果下一行除了 null,"",0 之外还有其他内容将被设置为最大值,因为max[i] 将失败,因此&amp;&amp; max[i]&gt;$i 将不会被执行,默认设置为将 $i 设置为最大值。
  • @User112638726 现在我明白了,好一个!所以说max[i]=(length(max[i])&gt;0 &amp;&amp; max[i]&gt;$i)?max[i]:$i应该是固定的,对吧?
  • 是的,应该这样做!真的不需要检查它是否大于 0,因为如果它是空的,它将是 false/0,尽管我想它确实使它更容易阅读:) 而且它也会导致与 min 相同的问题,但是相反的方式。
【解决方案2】:

遍历这些行并应用正则表达式来提取您要查找的数据,并将其添加到您想要的每一列的初始空列表中。

获得列表形式的列后,您可以将 max(list) min(list) avg(list) 函数应用于数据以获得您感兴趣的任何计算。

注意:您可能需要修改将数据添加到列表的位置,并将数字从 str 转换为 int 形式,以便 max、min、avg 函数可以对它们进行操作。

【讨论】:

  • 最好在他遍历每一行的时候计算统计;这样他就不需要建立列表了。
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多