2011-02-01 17 views
8

Por ejemplo, me gustaría transformar:Cómo transportar un conjunto de datos en un archivo csv?

Name,Time,Score 
Dan,68,20 
Suse,42,40 
Tracy,50,38 

En:

Name,Dan,Suse,Tracy 
Time,68,42,50 
Score,20,40,38 

EDIT: la pregunta original utiliza el término "transposición" de forma incorrecta.

+0

La palabra que está buscando es pivote, en lugar de transponer. – ocodo

+1

¿Qué has probado? ¿Es esta tarea? ¿POR QUÉ quieres transformarlo de algo habitual a algo raro? –

+1

lol. Ojalá volviera a los tiempos de hw –

Respuesta

27

Si el contenido del archivo entero cabe en la memoria, puede utilizar

import csv 
from itertools import izip 
a = izip(*csv.reader(open("input.csv", "rb"))) 
csv.writer(open("output.csv", "wb")).writerows(a) 

Básicamente se puede pensar en zip() y izip() como transpo las operaciones se:

a = [(1, 2, 3), 
    (4, 5, 6), 
    (7, 8, 9)] 
zip(*a) 
# [(1, 4, 7), 
# (2, 5, 8), 
# (3, 6, 9)] 

izip() evita la copia inmediata de los datos, pero, básicamente, hacer lo mismo.

+0

Eso es muy resbaladizo. Sin embargo, puede explicar lo que está haciendo, ya que probablemente no sea intuitivo para alguien que no esté familiarizado con los elementos iterativos de izip y python. – chmullig

+0

@chmullig: ejemplo agregado y explicativo. –

+2

Si el archivo completo _no encaja en la memoria, agregue más memoria –

0

Si lines es la lista de su texto original, lo que debería ser

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])) 

o utilizar csv módulo de Python - http://docs.python.org/library/csv.html

2
from 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=','))) 
+0

-1 Si Python 2.x, debería usar el modo binario en ambos archivos. Si Python 3.x, debería usar newline = '' en ambos archivos. También: 'delimiter = ','' es el valor predeterminado. –

0

Transferencia input.csv-output.csv. Los pandas también pueden ayudar.

import pandas as pd 
pd.read_csv('input.csv').T.to_csv('output.csv',header=False) 
0

La forma más sencilla es:

import numpy as np 
import pandas as pa 

import numpy as np 
import pandas as pa 

_mat = pa.read_csv("test.csv") 
_mat = _mat[_mat.columns[0:3]].values 
_t_mat = np.transpose(_mat) 

Resultado:

  • matriz de entrada es: [[1 2 3] [4 5 6]]
  • la salida es: [[1 4] [2 5] [3 6]]
Cuestiones relacionadas