web-dev-qa-db-ja.com

csvファイルのデータセットを転置する方法は?

たとえば、私は変換したいと思います:

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

に:

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

編集:元の質問は「転置」という用語を誤って使用していました。

18
zr.

ファイルの内容全体がメモリに収まる場合は、

_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()はデータの即時コピーを回避しますが、基本的には同じことを行います。

35
Sven Marnach

からの転送 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)
9
Da Qi
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=',')))
2
nosklo

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=',')))
1
Joe

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)
0
deepak

最も簡単な方法は次のとおりです。

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]]
  • 出力は次のとおりです。[[14] [2 5] [3 6]]
0
user6596781

linesが元のテキストのリストである場合、本来あるべきよりも

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 module - http://docs.python.org/library/csv.html

0
Elalfer