Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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 从中的多个列中筛选出非数字行_Python_Pandas_Numpy - Fatal编程技术网

Python 从中的多个列中筛选出非数字行

Python 从中的多个列中筛选出非数字行,python,pandas,numpy,Python,Pandas,Numpy,我有相当大的LZMA压缩数据文件,我想使用pandas读取这些文件,以提取某些列的最小值和最大值。该文件是使用grep-n从在MPI下运行的程序的日志文件生成的,因此包含多个MPI列同时写入标准输出的乱码行 这个问题非常类似于,但我需要为每个专栏做同样的事情三次。我尝试了各种各样的答案,但都没有用 以下是我迄今为止获得的Python脚本: import os#检查文件是否存在 为argc、argv导入系统 导入re#regex 将lzma作为xz导入 将numpy作为np导入 作为pd进口熊猫

我有相当大的LZMA压缩数据文件,我想使用pandas读取这些文件,以提取某些列的最小值和最大值。该文件是使用
grep-n
从在MPI下运行的程序的日志文件生成的,因此包含多个MPI列同时写入标准输出的乱码行

这个问题非常类似于,但我需要为每个专栏做同样的事情三次。我尝试了各种各样的答案,但都没有用

以下是我迄今为止获得的Python脚本:

import os#检查文件是否存在
为argc、argv导入系统
导入re#regex
将lzma作为xz导入
将numpy作为np导入
作为pd进口熊猫
#如果文件不存在,则快速退出
如果操作系统路径不存在(argv[1]):
帮助();sys.exit('错误:无法读取文件',argv[1]);
其他:
#定义列名和要采用的列
cols=[4,7,10];
colnames=['m','n','k'];
#通过LZMA解压器读取文件
ifname=argv[1];
ifile=xz.open(ifname,'rt');
数据=pd.read\u csv(ifile,delim\u空格=True\
usecols=cols,name=colnames\
错误(错误行=错误);
ifile.close();
###在此处插入筛选方法以将数据转换为数据\u clean
mdims=data_clean['m'].to_numpy();
mmin=np.amin(mdims);
mmax=np.amax(mdims);
ndims=数据清理['n'].到numpy();
nmin=np.amin(ndims);
nmax=np.amax(ndims);
kdims=data_clean['k']to_numpy();
kmin=np.amin(kdims);
kmax=np.amax(kdims);
#显示输出
打印(参考编号(ifname,'.xz','','':');
打印('M=',mmin',-',mmax);
打印('N=',nmin',-',nmax);
打印('K=',kmin',-',kmax);
系统出口(0);

是两个可用于测试的数据文件。任何帮助都将不胜感激。

在数据过滤方面,越快越好

在这里,我将使用转换器在加载时用NaN替换有问题的值。这样,过滤只需要
dropna

def convert(x):
    try:
        return np.int64(x)
    except ValueError:
        return np.nan
...
data = pd.read_csv( ifile, delim_whitespace=True, \
                    usecols=cols, names=colnames, \
                    error_bad_lines=False, \
                    converters= {k: convert for k in colnames})
data_clean = data.dropna().astype('int64')

但事实上,尝试使用csv阅读器为时已晚。因为它不在真正的csv文件中,但它包含以下行:

793883: zgemm: m =           51  n =           449 k =          2408
793884: zgemm: m =           51  n =           449 k =          2408
793885: zgemm: m =           51  n =           449 k =          2408
793886: zgemm: m =           51  n =           449 k =          2408
793887: zgemm: m =           51  n =           449 k =          2408
793888: zgemm: m =           51  n =           449 k =          2408
到目前为止还不错,问题是它还包含像

3251002: ) into (     zgemm: m =           51  n =           449 k =          2391
1735619: zgemm: m =           51  n =           449 k =          24043 x          243 
1747325: zgemm: m =           51  n =           449 k =          239          3 packing gntuju (          243 x          243
最后两行显示,试图修复错误行可能导致错误数据,因为某些值可能被截断或与其他数字连接

但是正则表达式应该足以识别有效行。因此,我会:

...
import re
...

    ...
    pattern = r'\d+:\s\w+:\s+m\s+=\s+(\d+)\s+n\s+=\s+(\d+)\s+k\s+=\s+(\d+)\s*$'
    rx = re.compile(pattern)
    data = pd.DataFrame((m.groups() for line in ifile
                       for m in (rx.match(line),) if m),
                      columns=colnames).astype('int64')
    ...

我认为这是朝着正确的方向迈出的一步,但我得到了奇怪的结果。。。对于第一个文件,脚本输出K=239-24043(应为~2400),对于第二个文件,脚本输出N=0-85和K=0-7048(N应为~80和K~7000)。但有一件事是肯定的:乱码行包含的列数与其余数据的列数不同。当行中的一列包含NaN时,如何删除整行?@wypan越快越好。IMHO最可靠的方法是使用正则表达式验证行。幸运的是,正则表达式可以捕获相关数据以提供数据帧。请看我的编辑。效果很好,谢谢!将你的答案标记为已接受。