For example, i would like to transform:
Name,Time,Score
Dan,68,20
Suse,42,40
Tracy,50,38
Into:
Name,Dan,Suse,Tracy
Time,68,
If the whole file contents fits into memory, you can use
import csv
from itertools import izip
a = izip(*csv.reader(open("input.csv", "rb")))
csv.writer(open("output.csv", "wb")).writerows(a)
You can basically think of zip()
and izip()
as transpose operations:
a = [(1, 2, 3),
(4, 5, 6),
(7, 8, 9)]
zip(*a)
# [(1, 4, 7),
# (2, 5, 8),
# (3, 6, 9)]
izip()
avoids the immediate copying of the data, but will basically do the same.
Read the CSV into pandas
data frame, pandas has build in function for transpose which can be invoked as below.
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)
Transfer from input.csv
to output.csv
. Pandas can also help.
import pandas as pd
pd.read_csv('input.csv', header=None).T.to_csv('output.csv', header=False, index=False)
Same answer of nosklo (all credits to him), but for 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=',')))
The simplest way is:
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)
Result:
- Input matrix is : [[1 2 3] [4 5 6]]
- the output is: [[1 4] [2 5] [3 6]]
If lines
is the list of your original text than it should be
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]))
or use csv
Python module - http://docs.python.org/library/csv.html