【问题标题】:merge two files based on common column values根据公共列值合并两个文件
【发布时间】:2019-03-01 16:47:09
【问题描述】:

我有 file1 喜欢:

1 A aa
2 A bb
3 A cc
4 A dd
5 B xx
6 C yy
7 C zz

还有一个文件2:

1 A 11
2 B 22
3 C 33

我想根据第 2 列将文件 1 和文件 2 合并到文件 3 中,这样:

1 A aa 11
2 A bb 11
3 A cc 11
4 A dd 11
5 B xx 22
6 C yy 33
7 C zz 33

哪种方法最简单?谢谢。

【问题讨论】:

    标签: python bash awk merge


    【解决方案1】:

    如果您使用 Python,使用pandas 会为您节省大量时间。所以如果你的 DataFrames 是df1:

       1   2
    0
    1  A  aa
    2  A  bb
    3  A  cc
    4  A  dd
    5  B  xx
    6  C  yy
    7  C  zz
    

    df2:

       1   2
    0
    1  A  11
    2  B  22
    3  C  33
    

    那么你可以使用merge:

    df1.merge(df2, left_on=1, right_on=1)
    

    得到

       1 2_x  2_y
    0  A  aa   11
    1  A  bb   11
    2  A  cc   11
    3  A  dd   11
    4  B  xx   22
    5  C  yy   33
    6  C  zz   33
    

    【讨论】:

    • 谢谢。我最初使用熊猫,但我的文件太大而无法加载。即使对于小文件,我也收到一条错误消息:“您正在尝试在 int64 和对象列上合并。请改用 concat”。不知道为什么当我“pd.read_csv('file.txt')”时两个文件的数据类型会变得不同。
    • @SteveXu 这表明您正在合并一个 int64 列和一个通用对象列。您可以使用astype 转换列。文件有多大?
    • 很多文件1G左右。首先将它们加载到 pandas 中很痛苦。
    • 我尝试了不同的方法,最后还是回到了 pandas。在加入文件之前,我尝试先减少文件。谢谢。
    【解决方案2】:

    哪种方式最简单

    我不确定您所说的最简单是什么意思。对于这个问题, 你可以简单地使用join:

    join -j 2 -o 1.1 1.2 1.3 2.3 file1 file2
    

    对于给定的示例,上述命令生成所需的输出。如果你的文件没有排序,你也可以添加--nocheck-order选项。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      相关资源
      最近更新 更多