Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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 - Fatal编程技术网

在Python中高效地保存表

在Python中高效地保存表,python,pandas,Python,Pandas,我的原始数据是一个纯文本文件。它由1255行和43列组成。我想创建一个只包含我感兴趣的数据的文本文件,而不是处理所有数据 例如,假设我想选择验证条件的所有数据:1

我的原始数据是一个纯文本文件。它由1255行和43列组成。我想创建一个只包含我感兴趣的数据的文本文件,而不是处理所有数据

例如,假设我想选择验证条件的所有数据:
1
。这是我的密码:

import numpy as np
import csv
import os

data = np.genfromtxt('data.txt', dtype = None)

path = os.getcwd()

csvfile = path + '/subgp1.txt'

counter = 0
with open(csvfile, 'w') as output:
    writer = csv.writer(output, delimiter = '\t')

    for row in range(len(data)):
        if (data[row][26] > 1 and data[row][26] < 7):
            counter += 1
            writer.writerow([counter, data[row][1], data[row][2], data[row][3], ... data[row][42]])
2.我有42列,这是浪费时间。我相信有一个更整洁、更快的方法来做到这一点

在类似于我寻求的任务中,程序包是否更有效?

而不是编写:

writer.writerow([counter, data[row][1], data[row][2], data[row][3], ... data[row][42]])
您可以将
[counter]
数据[行]
片段连接起来:

writer.writerow([counter] + data[row][1:])
更好的是,您可以直接迭代数据行:

for row in data:
    if (row[26] > 1 and row[26] < 7):
        counter += 1
        writer.writerow([counter] + row[1:])
对于数据中的行:
如果(第[26]行>1和第[26]行<7):
计数器+=1
writer.writerow([计数器]+行[1:])

为此,您需要导入集合,但您可以执行以下操作:

for ctr,row in enumerate(collections.ifilter(lambda r:r[26]>1 and r[26]<7, data)):
    writer.writerow([ctr, "%-8d' % row[1], row[2], row[3], 
                     '%-2.6f' %row[4],...])

对于ctr,enumerate(collections.ifilter)中的行(lambda r:r[26]>1和r[26]我得到一个错误:
索引器:无效索引
。即使我写入
打印数据[0][4:15]
我得到了相同的错误
索引器:无效索引
。我想这与我读取数据的格式有关:
np.genfromtxt
。注意:当我写入
打印数据[0][4]
时,代码执行时没有错误。那么您必须有不同长度的行。您应该使用
[1:]
取而代之。请看我修改后的答案。你说得对,这是低效的,因为:1-我一次为每个字段指定格式2-明确地写下我想将表中的所有列添加到另一个“子表”(知道我有42列!如果我有100列呢?200列呢?).我认为有一种更有效、更好的方法来准确地编码我想要的东西。
for ctr,row in enumerate(collections.ifilter(lambda r:r[26]>1 and r[26]<7, data)):
    writer.writerow([ctr, "%-8d' % row[1], row[2], row[3], 
                     '%-2.6f' %row[4],...])
format_strings = ('%d', '%-8d', '%s', '%s', '%-2.6f', ...)
for ctr,row in enumerate(collections.ifilter(lambda r:r[26]>1 and r[26]<7, data)):
    writer.writerow([f%v for f,v in zip(format_strings, [ctr]+row)])