如何在csv表中进行行到列的数据转置?

Fra*_*ank 29 python csv

我是脚本新手.我有一个table(Table1.txt),我需要创建另一个表,其中Table1的行按列排列,反之亦然.我已经为Perl和SQL找到了这个问题的解决方案,但是没有找到Python的解决方案.

我刚刚开始学习Python两天前,所以这是我得到的:

import csv
import sys

with open(sys.argv[1], "rt") as inputfile:
   readinput = csv.reader(inputfile, delimiter='\t')
   with open("output.csv", 'wt') as outputfile:
      writer = csv.writer(outputfile, delimiter="\t")
      for row in readinput:
            values = [row[0], row[1], row[2], row[3]]
            writer.writerow([values])
Run Code Online (Sandbox Code Playgroud)

这只是将列重现为列.我现在想做的是写最后一行,writer.writecol([values])但似乎没有这样的命令,我还没有找到另一种将行写为列的方法.

Man*_*ert 35

@Ashwini的答案是完美的.魔术发生在

zip(*lis)
Run Code Online (Sandbox Code Playgroud)

让我解释为什么这样做:zip(在最简单的情况下)两个列表和"拉链"它们:zip([1,2,3], [4,5,6])将成为[(1,4), (2,5), (3,6)].因此,如果您将外部列表视为矩阵并将内部元组视为行,那么这是一个转置(即,我们将行转换为列).

现在,zip是一个任意arity的函数,所以它可能需要两个以上的参数:

# Our matrix is:
# 1 2 3
# 4 5 6
# 7 8 9

zip([1,2,3], [4,5,6], [7,8,9])

>>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

# Now it is
# 1 4 7
# 2 5 8
# 3 6 9
Run Code Online (Sandbox Code Playgroud)

我们面临的问题是,在您的情况下,我们不知道我们想要传递多少个参数zip.但至少,我们已经知道了这些论点:它们是lis!lis是一个列表,该列表的每个元素也是一个列表(对应于输入文件中的一行数字).该*是告诉函数只是蟒蛇的方式"请使用任何的遵循与你的论点的元素,而不是事情本身!"

所以

lis = [[1,2,3], [4,5,6]]
zip(*lis)
Run Code Online (Sandbox Code Playgroud)

与...完全相同

zip([1,2,3], [4,5,6])
Run Code Online (Sandbox Code Playgroud)

恭喜,现在你是Python专家!;-)


Ash*_*ary 31

一般来说,转换一系列迭代的解决方案是:zip(*original_list)

样本输入:

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
Run Code Online (Sandbox Code Playgroud)

程序:

with open('in.txt') as f:
  lis = [x.split() for x in f]

for x in zip(*lis):
  for y in x:
    print(y+'\t', end='')
  print('\n')
Run Code Online (Sandbox Code Playgroud)

输出:

1   6   11  

2   7   12  

3   8   13  

4   9   14  

5   10  15
Run Code Online (Sandbox Code Playgroud)

  • +1解决方案一般是:`zip(*original_list)` (4认同)
  • @colourtheweb你必须使用Python 2,`print()`是Python 3中的一个函数,并接受一个名为`end`的可选参数.end的默认值是''\n'`. (2认同)

Aka*_*all 23

由于我们讨论的是列,行和转置,所以值得一提 numpy

>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
>>> x
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> x.T
array([[ 1,  4,  7, 10],
       [ 2,  5,  8, 11],
       [ 3,  6,  9, 12]])
Run Code Online (Sandbox Code Playgroud)