Python MatLab(或任何其他语言)转换矩阵或csv,以便在第一列值相同时将第二列值放入同一行?

Python MatLab(或任何其他语言)转换矩阵或csv,以便在第一列值相同时将第二列值放入同一行?,python,matlab,matrix,Python,Matlab,Matrix,比如我有 第1列|第2列 我想把它转换成 第1列|第2列|第3列|第4列 (3,4)元素应为空 我可以通过Matlab使用for和if来实现,但是对于海量数据来说,这需要花费太多的时间,所以我需要一个更优雅、更出色的想法 我更喜欢Matlab,但其他语言也可以。(如果其他语言可以解决我的问题,我可以将矩阵导出为csv、xlsx或txt,并使用其他语言。) 提前谢谢你 [更新] 如果 第1列|第2列|第3列 然后跑 [U ix iu] = unique(A(:,1) ); r= accum

比如我有

第1列|第2列 我想把它转换成

第1列|第2列|第3列|第4列 (3,4)元素应为空

我可以通过Matlab使用for和if来实现,但是对于海量数据来说,这需要花费太多的时间,所以我需要一个更优雅、更出色的想法

我更喜欢Matlab,但其他语言也可以。(如果其他语言可以解决我的问题,我可以将矩阵导出为csv、xlsx或txt,并使用其他语言。)

提前谢谢你

[更新]

如果

第1列|第2列|第3列 然后跑

    [U ix iu] = unique(A(:,1) ); r= accumarray( iu, A(:,2:3), [], @(x) {x'} )
请告诉我错误

    Error using accumarray
    Second input VAL must be a vector with one element for each row in SUBS, or a
    scalar.
我想做些什么

第一栏|第二栏|第三栏|第四栏|第五栏|第六栏|第七栏
我该怎么做?提前谢谢你

使用带有自定义功能的
accumarray

>> r = accumarray( A(:,1), A(:,2), [], @(x) {x'} ); %//'
 r = 
  [1x3 double]
  [1x2 double]
>> r{1}
 ans =
  1     3     9
>> r{2}
 ans =
  4     7
更新:
将单元格
r
转换为矩阵
B
(在注释中容纳进一步请求):


你能详细说明一下转换之间的逻辑吗?您的输入只有一个
3
,而输出有两个。哪个元素应该在哪里结束?你能给我们看一下你当前的代码吗?我不确定您是否可以在Matlab中不使用
for
循环就完成它,但我们可能能够帮助您改进现有的功能。@Schorsch Shai的可能复制迈出了一大步。但是我想把输出作为一个矩阵。如何将r{1}和r{2}合并到矩阵B中?我尝试了B=[r{1};r{2}],但失败了。也许将空单元格填充为其他单元格(如“5555555”)中极不可能存在的数字会起作用?然后在导出到xlsx后,我可以使用MS excel进行大规模替换。如何将这些空单元格填充为555,并使r{1},r{2}。。。作为一个大矩阵?可能与:+1重复:使用
unique(A(:,1))
作为
accumarray
的子矩阵可能更安全。如果列#1的值很大,则可能会得到不必要的大数组。非常感谢。但是如何将r{1}和r{2}合并到矩阵B中呢?我尝试了B=[r{1};r{2}],但失败了。我不明白它是什么意思。Shai的代码应该如何更改以适应您的建议?@user1849133
B
第二行的第三个元素应该是什么?嗯,它应该是空的。或者至少在使用xlswrite或其他方法导出到csv或xlsx时,它应该为空。
2             3          234
2             44         33
2             12         22
3             123        99
3             1232       45
5             224        57
    [U ix iu] = unique(A(:,1) ); r= accumarray( iu, A(:,2:3), [], @(x) {x'} )
    Error using accumarray
    Second input VAL must be a vector with one element for each row in SUBS, or a
    scalar.
2         3        234       44        33        12        22
3         123      99        1232      45
5         224      57
>> r = accumarray( A(:,1), A(:,2), [], @(x) {x'} ); %//'
 r = 
  [1x3 double]
  [1x2 double]
>> r{1}
 ans =
  1     3     9
>> r{2}
 ans =
  4     7
>> [U ix iu] = unique( A(:,1) ); % see EitantT's comment
>> r = accumarray( iu, A(:,2), [], @(x) {x'} ); 
>> n = cellfun( @numel, r ); % fund num elements in each row - need for max
>> mx = max(n);
>> pad = 555555; % padding value
>> r = cellfun( @(x) [x pad*ones(1,mx - numel(x))], r, 'uni', 0 );
>> B = vertcat( r{:} ); % construct B from padded rows of r