使用pandas或awk合并非常大的csv

时间:2017-04-07 07:12:46

标签: pandas join awk

我有2个csv如下(试图通过pandas读取它们)df1文件是17GB(我通过pandas read_csv读取它),df2是700mb,我想使用trig_seq进行合并。但是python被杀了。有没有办法通过awk / join

来实现
>>> df1.head()
   StreamId  SeqNum        Timestamp_p1     trig_seq
         1       1                14914503  10000000001
         1       2                  1491450  10000000002
         1       3                   1491450 10000000003
         1       4                  1491450  10000000004
         1       5                    149145  10000000005
>>> df2= pd.read_csv("/tmp/my.csv")
>>> df2.head()
     model_id  order               ctime     trig_seq
         e62  1000000  1493311414272  30021182183
         e62  1000001  149199641344  30021210134
          e22   1000002  1491081210880  30021227875
           e62   1000003  14951949824  30021239627
           e62   1000004  14927136256  30021241522
>>> r1 = pd.merge(df1,df2)
Killed

2 个答案:

答案 0 :(得分:0)

试试这个 -

$ cat f1
         1       1                14914503  10000000001
         1       2                  1491450  10000000002
         1       3                   1491450 10000000003
         1       4                  1491450  10000000004
         1       5                    149145  10000000005
$ cat f2
         e62  1000000  1493311414272  30021182183
         e62  1000001  149199641344  30021210134
          e22   1000002  1491081210880  30021227875
           e62   1000003  14951949824  30021239627
           e62   1000004  14927136256  30021241522
$ awk 'NR==FNR{a[NR]=$0;next} $2 in a {print $0,a[$1]}' f2 f1|column -t
1  1  14914503  10000000001  e62  1000000  1493311414272  30021182183
1  2  1491450   10000000002  e62  1000000  1493311414272  30021182183
1  3  1491450   10000000003  e62  1000000  1493311414272  30021182183
1  4  1491450   10000000004  e62  1000000  1493311414272  30021182183
1  5  149145    10000000005  e62  1000000  1493311414272  30021182183

答案 1 :(得分:0)

basicaly

awk 'FNR=NR{T[$4]=$3;next}{print $0 OFS T[$2]}' f1 f2 > New.f2

如果出现内存问题,请尝试加载仅需要的时间戳但读取两次f2

awk 'FNR==1 { f++ }
  f==1 { T[$2]; next }
  f==2 && ($4 in T) { T[$4]=$3; next }
  { print $0 OFS t[$2] }
  ' f2 f1 f2 > New.f2