如何根据每行的第二个值将Python多维numpy数组导出到不同的文件?

2024-05-19 17:07:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图导出一个numpy数组到不同的csv文件使用一个函数和基于 数据数组每行的第二个值。我的目标是在每行的第二个值相等时将数据导出到同一个文件。到目前为止,我可以创建不同的文件,但我也导出所有数据到每个文件。问题的第二部分是,我的数组中没有第二个值的最大选项数。这是我完成的代码:

a = np.array([(2,"Ana",9),(5,"Maria",4),(6,"Joao",3),
     (1,"Ana",4)])

export_path = r"c:"

def export(array_values):
    names = []
    for i in xrange(len(array_values)):
        names.append(array_values[i][1])
    names = sorted(set(names))

    for i in xrange(len(array_values)):
        for j in xrange(len(names)):
            if array_values[i][1] == names[j]:
                name = "..."
                export_file_path = os.path.join(export_path,name + ".csv")
                myfile = open(export_file_path, 'wb')
                wr = csv.writer(myfile, quoting=csv.QUOTE_NONE)
                wr.writerows(array_values)

export(a)

事先谢谢你的帮助。 伊沃


Tags: 文件csv数据pathnameinforlen
3条回答

首先,确定需要多少文件:

>>> unq, unq_idx = np.unique(a[:, 1], return_inverse=True)
>>> unq
array(['Ana', 'Joao', 'Maria'], 
      dtype='|S5')
>>> unq_idx
array([0, 2, 1, 0])

现在,您可以在组上循环,提取相应的行,然后保存它们:

for j, name in enumerate(unq):
    sub_a = a[unq_idx == j]
    # sub_a holds the lines that have name in the 2nd column
    ...

你知道吗itertools.groupby组()使这变得容易。你知道吗

import itertools as it
import numpy as np
from operator import itemgetter
import csv

a = np.array([(2,"Ana",9),(5,"Maria",4),(6,"Joao",3), (1,"Ana",4)])
name = itemgetter(1)
a = sorted(a, key = name)
for k, g in it.groupby(a, name):
    filename = k + '.csv' 
    with open(filename, 'wb') as f:
        writer = csv.writer(f)
        writer.writerows(list(g))

好吧:

def export(A):
    _v2=set(A[:,1])
    for item in _v2:
        sub_A=A[A[:,1]==item][:,[0,2]]
        with open(item+'.txt', 'w') as f:
            wr = csv.writer(f, quoting=csv.QUOTE_NONE)
            wr.writerows(sub_A)

应该生成3个文件:即ana.txt(由于名称已经成为文件名,我们可以从最终的csv文件中删除它):

2,9
1,4

相关问题 更多 >