Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从一个巨大的txt文件中获取分数列表的反向百分位数?_Python_R_Pandas_Awk_Scipy - Fatal编程技术网

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

Python 如何从一个巨大的txt文件中获取分数列表的反向百分位数?,python,r,pandas,awk,scipy,Python,R,Pandas,Awk,Scipy,我有一个非常大的文本文件(>80Gb)。它包含制表符分隔的值。我只对一个专栏感兴趣。对于那个特定的列,我想得到大约10个阈值的值。基本上,我的问题是这样的:“x列的值低于$threshold的行的百分比是多少?”。阈值大约为1、5、10、100、500、1000。 样本数据: dontcare dontcare interesting 1 10 502 2 10 0 3 10 100 4

我有一个非常大的文本文件(>80Gb)。它包含制表符分隔的值。我只对一个专栏感兴趣。对于那个特定的列,我想得到大约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分钟,速度非常快(最终得到一个文件&2“用法:$0”;退出1;} #检查awk cmd是否存在 命令-v$AWK_CMD>/dev/null 2>&1 | |{echo>&2“找不到$AWK_CMD。请安装并/或将其放入\$PATH。”退出1;} #构造最终命令 CMD=“$AWK_CMD”开始{total=0;” 对于t,以美元为单位;执行 #将init vars设置为零 CMD=“${CMD}n$t=0;” 完成 CMD=“${CMD};{total+=\$$COL};” 对于t,以美元为单位;执行 #取决于阈值的增量 CMD=“${CMD}{if(\$$COL>$t){n$t+=1}};” 完成 CMD=“${CMD}END{print\”表示:\“总计/NR;” 对于t,以美元为单位;执行 #产量百分比 CMD=“${CMD}print\”高于$t:\“n$t/NR*100;” 完成 CMD=“${CMD}}'$FILENAME” #echo$CMD eval$CMD#backticks和$()在这里不起作用
    我建议使用awk来实现这一点:

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

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

    此代码应该足够快:
    awk'BEGIN{n=0;getline};{if($3@MaratTalipov开始块的意义是什么?@User112638726,跳过标题line@MaratTalipov啊,好的,不需要n=0。所有变量在awk中都初始化为0。显式优于隐式。。。
    
    awk 'NR > 1 && $3 < 500 { ++n } END { if (NR > 1) print n / (NR - 1) * 100 }' file