Как мне переставить таблицу с повторяющимися значениями ключей?

355
RSFalcon7

У меня есть таблица, которая выглядит так:

Column A | Column B 10 | 0.1 10 | 0.2 10 | 0.3 20 | 0.4 20 | 0.5 20 | 0.6 

Мне нужно транспонировать это, чтобы выглядеть так:

 10 | 20 0.1 | 0.4 0.2 | 0.5 0.3 | 0.6 

Почти 2k разных значений в столбце A, для каждого есть ровно 1k значений в столбце B, которые могут повторяться.

Есть ли автоматизированный способ сделать это?

2
Используйте сводную таблицу! Eric F 5 лет назад 1
Подобный вопрос здесь: https://superuser.com/q/244507/76571 Вы, вероятно, можете использовать решения там, а затем просто добавить простой шаг транспонирования в конец, чтобы получить то, что вы хотите. Excellll 5 лет назад 1
Сводная таблица не хранит данные, я могу извлечь только определенные функции, которые будут применяться ко всем столбцам (минимальное, максимальное, среднее, стандартное отклонение, сумма, продукт и т. Д.) RSFalcon7 5 лет назад 1
Я также пробовал `vlookup`, но он находит только последнее значение столбца B для каждого значения столбца A RSFalcon7 5 лет назад 0
@ Excellll, действительно, эти ответы решат мою проблему, но ни сценарий VBA, ни решение электронной таблицы Google не смогли обработать объем данных. Они терпят крах с ошибками памяти (хотя у меня все еще есть много свободной памяти) RSFalcon7 5 лет назад 1
Какую версию Excel вы используете? Excellll 5 лет назад 0
Excel 2016 из Office 365 RSFalcon7 5 лет назад 0
Я знаю, что у вас есть решение на Python, но вы также можете сделать это с помощью Power Query, PQ может обрабатывать около 1 ГБ данных в 32-битной версии; намного больше в 64-битной версии. Ron Rosenfeld 5 лет назад 0
Проблема была не в памяти и не в процессоре. По крайней мере, в диспетчере задач ноутбук был загружен на ~ 50%, после аварий Excel он падает до ~ 45% RSFalcon7 5 лет назад 0

2 ответа на вопрос

1
RSFalcon7

Этот скрипт Python сделал свое дело:

import numpy as np  data = np.genfromtxt('inputcsv', delimiter=',') keys = sorted(set(data[:,0]))  result = np.array([])  for k in keys: col = data[np.where(data[:,0] == k)][:,1] if not result.any(): result = col else: result = np.vstack((result, col)) print('key finished'.format(k))  np.savetxt('final.csv', np.transpose(result), delimiter=',') 
Вы нашли решение своей проблемы, это здорово! Почему бы вам не опубликовать выдержки из входных и выходных файлов, чтобы все могли их просмотреть? И не забудьте принять ваш ответ, если он работает для вас. simlev 5 лет назад 0
Потому что примеры ввода и вывода находятся в вопросе RSFalcon7 5 лет назад 0
Я предлагал вам публиковать фактические файлы ввода и вывода, потому что я пытался запустить скрипт для вашего опубликованного ввода, и он выдает [ошибку] ​​(https://pastebin.com/RybF7CVH). Очевидно, что сценарий ожидает ввод CSV, поэтому [здесь] (https://pastebin.com/zf613j3w) с входом, отформатированным соответствующим образом. Вы упоминаете, что есть тысячи значений столбца A, поэтому я добавил только одно, и [this] (https://pastebin.com/Ls8Gs8YJ) является ошибкой, которую я получил. simlev 5 лет назад 0
0
simlev

Я бы испек PHP-скрипт:

<?php $file = fopen($argv[1], "r"); while(!feof($file)) { $line = trim(fgets($file)); if ($line=='')  $line = explode(' ', $line); $a[$line[0]] []= $line[1]; } fclose($file); foreach ($a as $k=>$v) { echo $k,"\t"; } echo "\n"; $a = array_map(null, ...$a); foreach($a as $b){ echo implode("\t",$b),"\n"; } 

Входной файл (разделенный табуляцией):

10 0.1 10 0.2 10 0.3 20 0.4 20 0.5 20 0.6 30 0.3 10 0.9 

Команда:

php script inputfile 

Вывод (через табуляцию):

10 20 30 0.1 0.4 0.3 0.2 0.5 0.3 0.6 0.9 

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