Как сделать транспонирование данных из таблицы в таблицу CSV?

Все это хорошо, но seq предположительно устарел, и большинство из них работают только с числовыми диапазонами.

Если вы заключите цикл for в двойные кавычки, стартовые и конечные переменные будут разыменованы, когда вы будете эхо-строки , и вы можете отправить строку обратно в BASH для выполнения. $i должен быть экранирован, поэтому он НЕ оценивается перед отправкой на подоболочку.

RANGE_START=a
RANGE_END=z
echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash

Этот вывод также может быть назначен переменной:

VAR=`echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash`

Единственный «служебный» ресурс, который должен генерировать, должен быть вторым экземпляром bash, поэтому он должен быть подходящим для интенсивных операций.

29
задан martineau 18 May 2017 в 02:09
поделиться

5 ответов

Решение для транспонирования последовательности итераций в целом: zip (* original_list)

пример ввода:

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15

программа:

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

вывод:

1   6   11  

2   7   12  

3   8   13  

4   9   14  

5   10  15
31
ответ дан Ashwini Chaudhary 18 May 2017 в 02:09
поделиться

Поскольку речь идет о столбцах, строках и транспонировании, возможно, стоит упомянуть 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]])
23
ответ дан Akavall 18 May 2017 в 02:09
поделиться

Вот один из способов сделать это, для простоты предположим, что вы просто хотите распечатать объекты по порядку:

  # lets read all the data into a big 2d array
  buffer = []
  for row in readinput: 
        values = [row[0], row[1], row[2], row[3]]  
        buffer.append(values)       

  # what you have in your code
  for i in range(len(buffer)):
      for j in range(len(buffer[0])):
          print buffer[i][j]

  # this is called a transpose; we have buffer[i][j] to read row then column, 
  #    switch i and j around to do the opposite
  for i in range(len(buffer[0])):
      for j in range(len(buffer)):
          print buffer[j][i]

Так как вам нужен массив для передачи в writer.writerow, вы можете сделать это

  for i in range(len(buffer[0])):
      writer.writerow([buffer[j][i] for j in range(len(buffer))])
1
ответ дан dfb 18 May 2017 в 02:09
поделиться

@ Ответ Ашвини идеален. Магия случается в

zip(*lis)

Позвольте мне объяснить, почему это работает: zip берет (в простейшем случае) два списка и «зипирует» их: zip([1,2,3], [4,5,6]) станет [(1,4), (2,5), (3,6)]. Поэтому, если вы рассматриваете внешний список как матрицу, а внутренние кортежи - как строки, это транспонирование (т. Е. Мы превратили строки в столбцы).

Теперь zip является функцией произвольной арности, поэтому она может принимать более двух аргументов:

# 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

Проблема, с которой мы сталкиваемся, заключается в том, что в Не знаю, сколько аргументов мы хотим передать zip. Но, по крайней мере, мы уже знаем аргументы: они являются элементами lis! lis - это список, и каждый элемент этого списка также является списком (соответствует одной строке чисел во входном файле). * - это просто способ выражения функции Pythons «пожалуйста, используйте в качестве аргументов элементы всего, что следует, а не саму вещь!»

Итак

lis = [[1,2,3], [4,5,6]]
zip(*lis)

точно так же, как

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

Поздравляю, теперь вы профессионал в Python! ; -)

35
ответ дан Manuel Ebert 18 May 2017 в 02:09
поделиться

Просто для построения ответа @Akavall, если вы хотите прочитать из файла, транспонировать и затем сохранить снова, просто сделайте:

from numpy import genfromtxt, savetxt
data = genfromtxt('in.txt')
savetxt('out.txt',data.T)

data.T в 3-й строке, где данные транспонируются .

1
ответ дан elyase 18 May 2017 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: