合并来自CSV的numpy ndarray

时间:2012-10-27 23:39:28

标签: python csv numpy genfromtxt

我有以下代码:

from numpy import genfromtxt
nysedatafile = os.getcwd() + '/nyse.txt';
nysedata = genfromtxt(nysedatafile, delimiter='\t', names=True, dtype=None);
nasdaqdatafile = os.getcwd() + '/nasdaq.txt';
nasdaqdata = genfromtxt(nasdaqdatafile, delimiter='\t', names=True, dtype=None);

现在我想合并来自2个CSV的数据,我尝试了各种功能:

例如:

import numpy as np;
alldata = np.array(np.concatenate((nysedata, nasdaqdata)));
print('NYSE stocks:' + str(nysedata.shape[0]));
print('NASDAQ stocks:' + str(nasdaqdata.shape[0]));
print('ALL stocks:' + str(alldata.shape[0]));

返回:

TypeError: invalid type promotion    

我也试过numpy.vstack并尝试在其上调用数组。 我希望最后一个打印件能够给出前两个csv文件的行总和。


编辑: 这个命令:

print('NYSE shape:' + str(nysedata.shape));
print('NASDAQ shape:' + str(nasdaqdata.shape));
print('NYSE dtype:' + str(nysedata.dtype));
print('NASDAQ dtype:' + str(nasdaqdata.dtype));

返回:

NYSE shape:(3257,)
NASDAQ shape:(2719,)
NYSE dtype:[('Symbol', 'S14'), ('Name', 'S62'), ('LastSale', 'S9'), ('MarketCap', '<f8'), ('ADR_TSO', 'S3'), ('IPOyear', 'S4'), ('Sector', 'S21'), ('industry', 'S62'), ('Summary_Quote', 'S38')]
NASDAQ dtype:[('Symbol', 'S14'), ('Name', 'S62'), ('LastSale', 'S7'), ('MarketCap', '<f8'), ('ADR_TSO', 'S3'), ('IPOyear', 'S4'), ('Sector', 'S21'), ('industry', 'S62'), ('Summary_Quote', 'S34')]

1 个答案:

答案 0 :(得分:2)

np.vstack(或np.concatenate)引发错误的原因是因为两个数组的dtypes不匹配。

请注意最后一个字段:('Summary_Quote', 'S38')('Summary_Quote', 'S34')。 nysedata的Summary_Quote列长度为38个字节,而nasdaqdata的列长度仅为34个字节。 (编辑:LastSale列遇到类似的问题。)

这是因为genfromtxt在设置dtype = None参数时猜测列的dtype。对于字符串列,genfromtxt确定包含所需的最小字节数 该列中的所有字符串。

因此要堆叠两个数组,必须将较小的数组提升为较大的数组:

import numpy.lib.recfunctions as recfunctions
recfunctions.stack_arrays([nysedata,nasdaqdata.astype(nysedata.dtype)], usemask = False)

(我之前的回答使用了np.vstack。这导致了一个二维的形状数组(N,1)。recfunctions.stack_arrays返回一个形状的一维数组(N,)。自{{1 }和nysedata是1维的,我认为最好还是返回1维数组。)

可能更简单的解决方案是首先连接两个csv文件,然后调用nasdaqdata

genfromtxt