python - 如何从一个巨大的txt文件中获取分数列表的反向百分位?

标签 python r pandas awk scipy

我有一个非常大的文本文件(>80Gb)。它包含制表符分隔的值。我只对一栏感兴趣。对于该特定列,我想获取 reverse percentile大约 10 个阈值。基本上,我的问题如下所示:“x 列的值低于 $threshold 的行的百分比是多少?”。阈值大致为 1、5、10、100、500、1000。 样本数据:

   dontcare dontcare interesting
   1        10       502
   2        10       0
   3        10       100
   4        10       23
   5        10       5

在上面的例子中,我想问“低于500的值的百分比是多少?”答案是 80%。

我该怎么做?

注释:

  • 首先使用 awk 过滤文件以获取感兴趣的列,大约需要 26 分钟,这在速度方面还不错(最终得到一个 <10Gb 的文件)。
  • 将生成的文件读入 pandas 数据帧大约需要 7 分钟;但计算( df[df < threshold].shape(0) / total_length )花费的时间太长。几个小时后我停止了计算。我想〜1小时就可以了。
  • wc -l <filename>df = pd.read_csv(filename, sep='\t', header=None); print(pandasdataframe)产生了不同数量的行,这让我感到惊讶。 (不过,我是 Pandas 新手)。
  • 我更喜欢 Python/Shell 中的解决方案,但我愿意接受任何想法。

编辑:

下面的答案是正确的。我想出了下面的脚本。仅供引用,读取预过滤文件(仅一列,<10G)花费了 1 小时 02 秒,读取原始文件(5 列,> 80G)花费了 1 小时 16 秒。为了简单起见,我不会对文件进行预过滤。在我的测试中,mawk 比 gawk 好 2 倍。我用过NR而不是(NR-1)因为没有标题行。

#!/bin/bash

FILENAME=$1
COL=$2 # one-based
AWK_CMD=mawk
THRESHOLDS="0 5 10 20 50 100 200 300 400 500 1000"

[ "$#" -ne 2 ] && { echo >&2 "usage: $0 <filename> <one-based-col>"; exit 1; }
# check if awk cmd exists
command -v $AWK_CMD >/dev/null 2>&1 || { echo >&2 "Cannot find $AWK_CMD. Please install and/or put it into your \$PATH."; exit 1; }

# constuct final cmd
CMD="$AWK_CMD 'BEGIN { total=0;"
for t in $THRESHOLDS; do
    # set init vars to zero
    CMD="${CMD} n$t=0;"
done
CMD="${CMD}}; { total+=\$$COL}; "
for t in $THRESHOLDS; do
    # increment depending on threshold
    CMD="${CMD} {if (\$$COL>$t) {n$t+=1}} ;"
done
CMD="${CMD} END { print \"mean: \" total/NR; "
for t in $THRESHOLDS; do
    # output percentage
    CMD="${CMD} print \"above$t: \" n$t/NR*100 ;"
done
CMD="${CMD} }' $FILENAME"

# echo $CMD
eval $CMD # backticks and $() won't work here

最佳答案

我建议使用 awk 来执行此操作:

awk 'NR > 1 && $3 < 500 { ++n } END { if (NR > 1) print n / (NR - 1) * 100 }' file

对于第一行之后第三个字段小于 500 的所有行,递增 n。文件处理完毕后,只要读取了一条或多条记录,就打印百分比(这可以避免除以 0)。

关于python - 如何从一个巨大的txt文件中获取分数列表的反向百分位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598562/

相关文章:

python - Scipy 中没有图像函数

python - Kivy 侧边栏加上内容布局

python - Plotly:如何检查基本图形结构(版本 4)

r - 从第一次出现 Pattern 到结束设置值 NA

python - 如何使用 R studio 导入 Pandas

Python Pandas 在索引上加入数据框

python setup.py sdist 错误 : Operation not permitted

r - 数据表映射

python - 如何将 IP 转换为向量值

python - 评估 Pandas DataFrame 中的 bool 表达式