Python 如何从一个巨大的txt文件中获取分数列表的反向百分位数?
我有一个非常大的文本文件(>80Gb)。它包含制表符分隔的值。我只对一个专栏感兴趣。对于那个特定的列,我想得到大约10个阈值的值。基本上,我的问题是这样的:“x列的值低于$threshold的行的百分比是多少?”。阈值大约为1、5、10、100、500、1000。 样本数据: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
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的所有行,递增
。处理完文件后,只要读取了一个或多个记录,就打印百分比(这避免了被0除)。此代码应该足够快:n
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