【问题标题】:Joining two different datasets using multiple keyvalues使用多个键值连接两个不同的数据集
【发布时间】:2018-03-30 01:32:52
【问题描述】:

我有两组数据。

第一个数据集如下所示:

Storm_ID,Cell_ID,Wind_speed
2,10236258,27
2,10236300,58
2,10236301,25
3,10240400,51

第二个数据集如下所示:

Storm_ID,Cell_ID,Storm_surge
2,10236299,0.27
2,10236300,0.27
2,10236301,0.35
2,10240400,0.35
2,10240401,0.81
4,10240402,0.11

现在我想要一个看起来像这样的输出:

Storm_ID,Cell_ID,Wind_speed,Storm_surge
2,10236258,27,0
2,10236299,0,0.27
2,10236300,58,0.27
2,10236301,25,0.35
2,10240400,0,0.35
2,10240401,0,0.81
3,10240400,51,0
4,10240402,0,0.11

我尝试在 Linux 中加入命令来执行此任务,但失败了。加入命令跳过了数据库中不匹配的行。我可以使用 Matlab,但数据大小超过 100 GB,这使得这项任务非常困难。 有人可以指导我吗?我可以使用 SQL 或 python 来完成这个任务吗?感谢您的帮助,谢谢。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • @Gordon 在上面的示例中已经表示了小型数据库集。抱歉,如果这不是正确的方法。我是堆栈溢出的新手
  • @GordonLinoff 我不确定他是否想使用数据库。看起来他有一个 CSV 文件并想使用 UNIX join 命令 shapeshed.com/unix-join 对我来说这看起来是一个有趣的问题,但他仍然需要更多地解释他对 skipped the rows which didn't match in the database 的含义。好像他有 SQL 和 CSV 中的数据,当他将 SQL JOIN 与 CSV UNIX 连接进行比较时,结果不同。我们无法从给出的信息中知道原因。

标签: python sql linux join multikey


【解决方案1】:

我想你想要一个full outer join:

select storm_id, cell_id,
       coalesce(d1.wind_speed, 0) as wind_speed,
       coalesce(d2.storm_surge, 0) as storm_surge
from dataset1 d1 full join
     dataset2 d2
     using (storm_id, cell_id);

【讨论】:

    【解决方案2】:

    纯外壳解决方案

    首先备份您的文件

    假设您的文件名为 wind1.txt 和 wind2.txt

    您可以应用这些 shell 命令集:

    perl -pi -E "s/,/_/" wind*
    perl -pi -E 's/(.$)/$1,0/' wind1.txt
    perl -pi -E "s/,/,0,/"     wind2.txt
    join --header -a 1 -a 2 wind1.txt wind2.txt > outfile.txt
    

    中间结果

    Storm_ID_Cell_ID,Wind_speed,0
    2_10236258,27,0
    2_10236299,0,0.27
    2_10236300,0,0.27
    2_10236300,58,0
    2_10236301,0,0.35
    2_10236301,25,0
    2_10240400,0,0.35
    2_10240401,0,0.81
    3_10240400,51,0
    4_10240402,0,0.11
    

    现在将第 0 行重命名为“storm_surge”,将第一个 _ 替换为数字中的“,”

    perl -pi -E "s/Wind_speed,0/Wind_speed,Storm_surge/" outfile.txt
    perl -pi -E 's/^(\d+)_/$1,/' outfile.txt
    perl -pi -E "s/Storm_ID_Cell_ID/Storm_ID,Cell_ID/" outfile.txt
    

    中间结果:

    Storm_ID,Cell_ID,Wind_speed,Storm_surge
    2,10236258,27,0
    2,10236299,0,0.27
    2,10236300,0,0.27
    2,10236300,58,0
    2,10236301,0,0.35
    2,10236301,25,0
    2,10240400,0,0.35
    2,10240401,0,0.81
    3,10240400,51,0
    4,10240402,0,0.11
    

    最后运行这个:

    awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[$1,$2]+=$3+$4 }END {for (i in arr) print i,arr[i]}' outfile.txt  | sort
    

    (抱歉 - Q 在回答时已关闭)

    【讨论】:

      【解决方案3】:

      awk -F, -v OFS=, '{x = $1 "," $2} FNR == NR {a[x] = $3; b[x] = 0;下一个} {b[x] = $3} !a[x] {a[x] = 0} END {for (i in a) print i, a[i], b[i]}' f1 f2 |排序-n

      因为它是一个循环,所以 awk 会产生随机顺序。因此在最后进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多