【问题标题】:Merge large csv files in specific way以特定方式合并大型 csv 文件
【发布时间】:2021-02-13 06:34:53
【问题描述】:

我已经看到了很多关于这个的其他问题,但我的情况有点不同。

我正在尝试制作/找到一个可以按以下方式合并 csv 文件的程序。

file1.csv 

colHeadders    1col1head    1col2head      1col3head ...

row1head       1data[1][1]  1data[1][2]  1data[1][3] ...

row2head       1data[2][1]  1data[2][2]  1data[2][3] ...

headNotShared  1data[3][1]  1data[3][2]  1data[3][3] ...

row4head       1data[4][1]  1data[4][2]  1data[4][3] ...

...


file2.csv 

colHeadders    2col1head   2col2head    2col3head ...

row1head       2data[1][1] 2data[1][2]  2data[1][3] ...

row2head       2data[2][1] 2data[2][2]  2data[2][3] ...

row4head       2data[3][1] 2data[3][2]  2data[3][3] ...

headNotShared  2data[4][1] 2data[4][2]  2data[4][3] ...

...



merged.csv 

colHeaders 1col1head   1col2head    1col3head ...    2col1head   2col2head    2col3head ...

row1head   1data[1][1] 1data[1][2]  1data[1][3] ...  2data[1][1] 2data[1][2]  2data[1][3]

row2head   1data[2][1] 1data[2][2]  1data[2][3] ...  2data[2][1] 2data[2][2]  3data[3][2]

row4head   1data[4][1]  1data[4][2]  1data[4][3] ... 2data[3][1] 2data[3][2]  2data[3][3] ...

...

另外棘手的部分是文件可能不会共享所有标题,在这种情况下,我希望合并的 csv 仅包含具有共享标题的行。如果有帮助,我正在使用的确切文件是大型甲基化 prfile,我正在尝试预处理数据。文件的实际外观如下:

------        03--34   08--45   08--59  ...

cg000000957   0.8950   0.8876   0.8953  ...

cg000001349   0.7687   0.7687   0.7700  ...

...


------        03--34   08--45   08--59  ...

cg000000957   0.8951   0.8877   0.8954  ...

cg000001101   0.6013   0.6100   0.6022  ...

...

知道行标题按升序排列可能会有所帮助。这些是大型文件,超过演出,因此速度至关重要。语言并不重要,我尝试编写一个 bash 脚本来执行此操作,但无济于事。 csv 文件为 txt 格式,由 \space 制表符分隔。

【问题讨论】:

    标签: java python bash csv optimization


    【解决方案1】:

    我在 python 3.7 上运行此代码,它可以满足您的需求。

    import pandas as pd
    df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                        index=[0, 1, 2, 3])
    
    df2 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                        'D': ['D2', 'D3', 'D6', 'D7'],
                        'F': ['F2', 'F3', 'F6', 'F7']},
                        index=[2, 3, 6, 7])
    
    result = pd.concat([df1, df2], axis=1, sort=False)
    print(result.dropna())
    

    输出:

        A   B   C   D   B   D   F
    2  A2  B2  C2  D2  B2  D2  F2
    3  A3  B3  C3  D3  B3  D3  F3
    

    【讨论】:

      【解决方案2】:

      另一种方法(虽然是 Python 3.x):

      # Read both file into pandas dataframe
      df1 = pd.read_csv("file1.csv", sep="\t").set_index("colHeadders")
      df2 = pd.read_csv("file2.csv", sep="\t").set_index("colHeadders")
      
      # Join them with an inner join (only index contained in both dataframes are kept)
      new_df = df1.join(df2, how="inner", lsuffix="_df1", rsuffix="_df2")
      

      输出:

                   1col1head_df1    1col2head_df1    1col3head_df1    2col1head_df2 ...
      colHeadders                                                                    
      row1head     1data[1][1]      1data[1][2]      1data[1][3]      2data[1][1] ...
      row2head     1data[2][1]      1data[2][2]      1data[2][3]      2data[2][1] ...
      row4head     1data[4][1]      1data[4][2]      1data[4][3]      2data[3][1] ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-23
        • 2021-05-04
        • 1970-01-01
        • 2015-04-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        相关资源
        最近更新 更多