例如,我想要改变:
Name,Time,Score
Dan,68,20
Suse,42,40
Tracy,50,38
进入:Name,Dan,Suse,Tracy
Time,68,42,50
Score,20,40,38
编辑:原问题中错误地使用了“transpose”一词。
如果整个文件的内容可以一次性载入内存,你可以使用
import csv
from itertools import izip
a = izip(*csv.reader(open("input.csv", "rb")))
csv.writer(open("output.csv", "wb")).writerows(a)
你可以基本上把zip()
和izip()
看作转置操作:a = [(1, 2, 3),
(4, 5, 6),
(7, 8, 9)]
zip(*a)
# [(1, 4, 7),
# (2, 5, 8),
# (3, 6, 9)]
izip()
避免了立即复制数据,但基本上会执行相同的操作。
从 input.csv
转移到 output.csv
。Pandas 也可以帮助。
import pandas as pd
pd.read_csv('input.csv', header=None).T.to_csv('output.csv', header=False, index=False)
csv.writerows(my_list)
不能满足我的需求。相反,我必须使用 csv.writerow(my_list)
然后使用您的转置一行代码来将我的一行变成多行。太疯狂了! - Alain与nosklo的回答相同(所有信用归给他),但是适用于python3:
from csv import reader, writer
with open('source.csv') as f, open('destination.csv', 'w') as fw:
writer(fw, delimiter=',').writerows(zip(*reader(f, delimiter=',')))
open(output_filename, 'w', newline='') as fw
或者是双倍行距。 - Bernd Wechnerfrom itertools import izip
from csv import reader, writer
with open('source.csv') as f, open('destination.csv', 'w') as fw:
writer(fw, delimiter=',').writerows(izip(*reader(f, delimiter=',')))
delimiter=','
是默认值。 - John Machinlines
是您原始文本的列表,则应该是这样的。for i in range(1,len(lines)):
lines[i] = lines[i].split(',')
new_lines = []
for i in range(len(lines[0])):
new_lines.append("%s,%s,%s" % (lines[0][i], lines[1][i], lines[2][i]))
或者使用 csv
Python 模块 - http://docs.python.org/library/csv.html
最简单的方法是:
import numpy as np
import pandas as pd
_mat = pd.read_csv("test.csv")
_mat = _mat[_mat.columns[0:3]].values
_t_mat = np.transpose(_mat)
结果:
- 输入矩阵为:[[1 2 3] [4 5 6]]
- 输出为:[[1 4] [2 5] [3 6]]
将CSV文件读入pandas
数据框中,pandas内置了转置函数,可以按以下方式调用。
import pandas as pd
csv = pd.read_csv("test.csv", skiprows=1)
# use skiprows if you want to skip headers
df_csv = pd.DataFrame(data=csv)
transposed_csv = df_csv.T
print(transposed_csv)
not not x
而不是bool(x)
的人 :-) - John Machin