求助!matlab根据数据相同的列合并cell

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助!matlab根据数据相同的列合并cell相关的知识,希望对你有一定的参考价值。

有两个cell型矩阵,a = 'a','m1';'a','m2';'b','m2';'c', 'm3'; b = 'a', 'x1'; 'c', 'x2';
需要将a和b中第一列相同的合并,得到的结果为 c = 'a', 'm1', 'x1' ;'a' , 'm2', 'x1'; 'b', 'm2', ''; 'c', 'm3', 'x2' ;
有没有自带函数或者用向量的方法可以实现上述结果的?还是说要写循环自己匹配
求代码!谢谢~

参考技术A 不用CELL,用符号矩阵行不 参考技术B

a = 'a','m1';'a','m2';'b','m2';'c', 'm3';
b = 'a', 'x1'; 'c', 'x2';
[m1,n1]=size(a);
[m2,n2]=size(b);
c=cell(4,3);
for i=1:m1
    for j=1:n1
        if (~isequal(a(i,j),b(1,1)))&&(~isequal(a(i,j),b(2,1)))
            c(i,j)=a(i,j);
        end
        if isequal(a(i,j),b(1,1))&&isequal(a(i,j),b(2,1))
            c(i,j)=a(i,j);
            c(i,j)='';
        end
        if ~isequal(a(i,j),b(1,1))&&isequal(a(i,j),b(2,1))
             c(i,j)=a(i,j);
             c(i,3)=b(1,1);
        end
        if isequal(a(i,j),b(1,1))&&~isequal(a(i,j),b(2,1))
             c(i,j)=a(i,j);
             c(i,3)=b(2,1);
        end
    end
end

c

本回答被提问者和网友采纳
参考技术C ……

使用熊猫合并相同的列

【中文标题】使用熊猫合并相同的列【英文标题】:Merging columns with same same using pandas 【发布时间】:2021-05-28 10:17:28 【问题描述】:

我在 CSV 文件中有以下数据:

time   conc   time   conc   time    conc   time   conc
1:00    10    5:00   11     9:00    55     13:00   1
2:00    13    6:00   8      10:00   6      14:00   4 
3:00    9     7:00   7      11:00   8      15:00   3
4:00    8     8:00   1      12:00   11     16:00   8

我只是想将它们合并为:

time   conc  
1:00   10
2:00   13
3:00   9
4:00   8
...
16:00  8

我有超过 1000 列,但我是 pandas 的新手。所以只是想知道我如何才能实现?

【问题讨论】:

【参考方案1】:

一种方法是将数据帧切割成两列切片,然后在重命名后使用 pd.concat() 重新组合。 先正常加载dataframe:

df = pd.read_csv('time_conc.csv')
df

看起来像下面这样。注意 pd.read_csv() 为重复的列名添加了后缀:

    time    conc    time.1  conc.1  time.2  conc.2  time.3  conc.3
0   1:00    10      5:00    11      9:00    55      13:00   1
1   2:00    13      6:00    8       10:00   6       14:00   4
2   3:00    9       7:00    7       11:00   8       15:00   3
3   4:00    8       8:00    1       12:00   11      16:00   8

然后使用 pd.DataFrame.iloc 进行切片:

total_columns = len(df.columns)
columns_per_set = 2

column_sets = [df.iloc[:,set_start:set_start + columns_per_set].copy() for set_start in range(0, total_columns, columns_per_set)]

column_sets 现在是一个列表,将每对重复列作为单独的数据框保存。接下来,遍历列表以将列重命名为原始名称:

for s in column_sets:
    s.columns = ['time', 'conc']

这会修改每个两列数据框,以便它们的列名匹配。 最后使用 pd.concat() 通过匹配列轴来组合它们:

new_df = pd.concat(column_sets, axis=0, sort=False)
new_df

这为您提供了完整的两列:

    time    conc
0   1:00    10
1   2:00    13
2   3:00    9
3   4:00    8
0   5:00    11
1   6:00    8
2   7:00    7
3   8:00    1
0   9:00    55
1   10:00   6
2   11:00   8
3   12:00   11
0   13:00   1
1   14:00   4
2   15:00   3
3   16:00   8

【讨论】:

【参考方案2】:

由于您的文件有重复的列名,Pandas 会添加后缀。默认情况下,DataFrame 标头将类似于 ['time', 'conc', 'time.1', 'conc.1', 'time.2', 'conc.2', 'time.3', 'conc. 3' ...]

假设你的 CSV 文件的分隔符是逗号:

import pandas as pd
df = pd.read_csv('/path/to/your/file.csv', sep=',')
total_n = len(df.columns)

lst = []
for x in range(int(total_n / 2 )):
    if x == 0:
        cols = ['time', 'conc']
    else:
        cols = ['time'+'.'+str(x), 'conc'+'.'+str(x)]
    df_sub = df[cols]  #Slice two columns each time
    df_sub.columns = ['time', 'conc']  #Slices should have the same column names
    lst.append(df_sub)
df = pd.concat(lst)  #Concatenate all the objects

【讨论】:

【参考方案3】:

假设df 是一个带有 csv 文件数据的 DataFrame,您可以尝试以下操作:

# rename columns if needed
df.columns = ["time", "conc"]*(df.shape[1]//2)
# concatenate pairs of adjacent columns
pd.concat([df.iloc[:, [i, i+1]] for i in range(0, df.shape[1], 2)])

它给出:

     time conc
0    1:00  10
1    2:00  13
2    3:00   9
3    4:00   8
0    5:00  11
..    ...  ..
3   12:00  11
0   13:00   1
1   14:00   4
2   15:00   3
3   16:00   8

【讨论】:

以上是关于求助!matlab根据数据相同的列合并cell的主要内容,如果未能解决你的问题,请参考以下文章

如何根据不同的列合并行(可以查询吗?)

合并table中值相同的列

当不存在公共记录时,Pandas 合并删除添加的列

SQL 两张表合并 (两张表的列都相同)

合并具有相同标题的包含拆分数据的列

r 根据指定的列合并两个数据帧。默认情况下,仅合并匹配的行。