在python中转换和合并csv文件的快速方法?

2024-03-29 14:29:49 发布

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

我试图转置多个相同格式的文件,并将它们合并成一个大的CSV文件。我想用numpy来转置,因为这是一种非常快速的方法,但它不知怎么地跳过了我需要的所有头文件。这些是我的档案:

testfile1.csv
time,topic1,topic2,country
2015-10-01,20,30,usa
2015-10-02,25,35,usa

testfile2.csv
time,topic3,topic4,country
2015-10-01,40,50,uk
2015-10-02,45,55,uk

这是我的代码,用于将所有csv文件转换并合并为一个大文件:

^{pr2}$

这是打印输出。它显示了一些转置工作,但缺少我的标题:

[[ nan  nan  nan  nan]
 [ nan  20.  30.  nan]
 [ nan  25.  35.  nan]] my_data, not transposed
[[ nan  nan  nan]
 [ nan  20.  25.]
 [ nan  30.  35.]
 [ nan  nan  nan]] transposed_data

这是我的预期输出:

      ,2015-10-01,2015-10-02,country
topic1,20,25,usa
topic2,30,35,usa
topic3,40,45,uk
topic4,50,55,uk

Tags: 文件csvdatatime格式nancountryuk
1条回答
网友
1楼 · 发布于 2024-03-29 14:29:49

genfromtxt中有多种处理头的方法。默认情况下,将它们视为数据的一部分:

In [6]: txt="""time,topic1,topic2,country
   ...: 2015-10-01,20,30,usa
   ...: 2015-10-02,25,35,usa"""

In [7]: data=np.genfromtxt(txt.splitlines(),delimiter=',',skip_header=0)

In [8]: data
Out[8]: 
array([[ nan,  nan,  nan,  nan],
       [ nan,  20.,  30.,  nan],
       [ nan,  25.,  35.,  nan]])

但是由于默认的dtype是float,所以字符串都显示为nan。在

您可以将它们视为标头-结果是一个结构化数组。标题现在出现在data.dtype.names列表中。在

^{pr2}$

使用dtype=None,让它选择数据类型。基于第一行中的字符串,它以S10的形式加载所有内容。在

In [11]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=None)

In [12]: data
Out[12]: 
array([['time', 'topic1', 'topic2', 'country'],
       ['2015-10-01', '20', '30', 'usa'],
       ['2015-10-02', '25', '35', 'usa']], 
      dtype='|S10')

此矩阵可以转置、打印或写入csv文件:

In [13]: data.T
Out[13]: 
array([['time', '2015-10-01', '2015-10-02'],
       ['topic1', '20', '25'],
       ['topic2', '30', '35'],
       ['country', 'usa', 'usa']], 
      dtype='|S10')

因为我使用genfromtxt来加载,所以我可以使用savetxt来保存:

In [26]: with open('test.txt','w') as f:
    np.savetxt(f, data.T, delimiter=',', fmt='%12s')
    np.savetxt(f, data.T, delimiter=';', fmt='%10s') # simulate a 2nd array
   ....:     

In [27]: cat test.txt
        time,  2015-10-01,  2015-10-02
      topic1,          20,          25
      topic2,          30,          35
     country,         usa,         usa
      time;2015-10-01;2015-10-02
    topic1;        20;        25
    topic2;        30;        35
   country;       usa;       usa

相关问题 更多 >