Wie kann ich eine Tabelle mit wiederholten Schlüsselwerten transponieren?

1199
RSFalcon7

Ich habe eine Tabelle, die so aussieht:

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

Ich muss es umsetzen, um so auszusehen:

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

Fast 2k verschiedene Werte in Spalte A, für jeden gibt es genau 1k-Werte in Spalte B, die sich möglicherweise wiederholen.

Gibt es einen automatisierten Weg, dies zu tun?

2
Verwenden Sie eine PivotTable! Eric F vor 5 Jahren 1
Ähnliche Frage hier: https://superuser.com/q/244507/76571 Sie können wahrscheinlich die Lösungen dort verwenden und dann am Ende einen einfachen Transponierungsschritt hinzufügen, um das zu erhalten, was Sie möchten. Excellll vor 5 Jahren 1
Eine PivotTable speichert die Daten nicht. Ich kann nur bestimmte Funktionen extrahieren, die für alle Spalten gelten (Min, Max, Durchschnitt, Stddev, Summe, Produkt usw.). RSFalcon7 vor 5 Jahren 1
Ich habe auch "vlookup" ausprobiert, aber es findet nur den letzten Wert von Spalte B für jeden Wert von Spalte A RSFalcon7 vor 5 Jahren 0
@Excellll in der Tat würden diese Antworten mein Problem lösen, aber weder das VBA-Skript noch die Google Spreadsheet-Lösung waren in der Lage, die Datenmenge zu verarbeiten. Sie stürzen mit Speicherfehlern ab (obwohl ich noch genügend freien Speicher habe) RSFalcon7 vor 5 Jahren 1
Welche Version von Excel verwenden Sie? Excellll vor 5 Jahren 0
Excel 2016 von Office 365 RSFalcon7 vor 5 Jahren 0
Ich weiß, dass Sie eine Python-Lösung haben, aber Sie können dies auch mit "Power Query" tun. "PQ" kann in der 32-Bit-Version etwa 1 GB Daten verarbeiten. viel mehr in der 64-Bit-Version. Ron Rosenfeld vor 5 Jahren 0
Das Problem war weder Speicher noch CPU. Zumindest im Task-Manager war das Notebook zu ~ 50% ausgelastet, nach Abstürzen von Excel sinkt es auf ~ 45%. RSFalcon7 vor 5 Jahren 0

2 Antworten auf die Frage

1
RSFalcon7

Dieses Python-Skript hat den Trick:

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=',') 
Sie haben eine Lösung für Ihr Problem gefunden, das ist großartig! Warum posten Sie keine Auszüge aus den Eingabe- und Ausgabedateien, die alle prüfen können? Und vergessen Sie nicht, Ihre Antwort zu akzeptieren, wenn sie für Sie funktioniert. simlev vor 5 Jahren 0
Weil die Beispiele für Eingabe und Ausgabe in der Frage stehen RSFalcon7 vor 5 Jahren 0
Ich habe Ihnen vorgeschlagen, tatsächliche Eingabe- und Ausgabedateien zu posten, da ich versucht habe, das Skript gegen Ihre geposteten Eingaben auszuführen, und es wird ein Fehler angezeigt (https://pastebin.com/RybF7CVH). Offensichtlich erwartet das Skript eine CSV-Eingabe, so dass [hier] (https://pastebin.com/zf613j3w) die Eingabe entsprechend formatiert ist. Sie erwähnen, dass es Tausende von Spalten-A-Werten gibt, also habe ich nur einen hinzugefügt und [this] (https://pastebin.com/Ls8Gs8YJ) ist der Fehler, den ich erhalten habe. simlev vor 5 Jahren 0
0
simlev

Ich würde ein PHP-Skript backen:

<?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"; } 

Eingabedatei (tabulatorgetrennt):

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

Befehl:

php script inputfile 

Ausgabe (tabulatorgetrennt):

10 20 30 0.1 0.4 0.3 0.2 0.5 0.3 0.6 0.9