如何转置具有重复键值的表?

如何转置具有重复键值的表?

我有一张如下所示的表格:

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

A 列中有近 2k 个不同的值,而每个值在 B 列中恰好有 1k 个值,这些值可能会重复。

有没有自动化的方法可以做到这一点?

答案1

这个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 {0} finished'.format(k))

np.savetxt('final.csv', np.transpose(result), delimiter=',')

答案2

我会编写一个 PHP 脚本:

<?php
$file = fopen($argv[1], "r");
while(!feof($file)) {
    $line =  trim(fgets($file));
    if ($line=='') {continue;}
    $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

相关内容