如何在连接时合并大型数据框并消除不相关的列?

时间:2017-11-06 09:48:53

标签: python pandas dataframe merge dask

给定一个数据框,其中第一列链接到第3列和第5列,第2列链接到第4列和第6列。列是:

  • SRC ID SRC列的唯一索引
  • TRG ID TRG列的唯一索引
  • SRC LANG SRC列的语言
  • TRG LANG TRG列的语言
  • SRC SRC LANG
  • 指定语言的文字
  • TRG TRG LANG
  • 指定语言的文字

注意:SRCTRG是彼此的翻译。

在代码中:

from io import StringIO
import pandas as pd

instr = """SRC ID   TRG ID  SRC LANG    TRG LANG    SRC TRG
8366    170897  fra jpn C'est sec comme la poussière.   砂をかむように味気ないね。
8366    243583  fra eng C'est sec comme la poussière.   It's dry as dust.
8366    1840509 fra epo C'est sec comme la poussière.   Estas seke, kiel polvo.
8366    4401595 fra tur C'est sec comme la poussière.   Toz kadar kuru.
1   77  cmn deu 我們試試看!  Lass uns etwas versuchen!
1   1276    cmn eng 我們試試看!  Let's try something.
1   2481    cmn spa 我們試試看!  ¡Intentemos algo!
1   5350    cmn kor 我們試試看!  뭔가 해보자!
1   344899  cmn jpn 我們試試看!  やってみましょう。
1   345549  cmn cmn 我們試試看!  试一下吧。
"""
pd.read_csv(StringIO(instr), sep='\t')

[OUT]:

SRC ID  TRG ID  SRC LANG    TRG LANG    SRC TRG
0   8366    170897  fra jpn C'est sec comme la poussière.   砂をかむように味気ないね。
1   8366    243583  fra eng C'est sec comme la poussière.   It's dry as dust.
2   8366    1840509 fra epo C'est sec comme la poussière.   Estas seke, kiel polvo.
3   8366    4401595 fra tur C'est sec comme la poussière.   Toz kadar kuru.
4   1   77  cmn deu 我們試試看!  Lass uns etwas versuchen!
5   1   1276    cmn eng 我們試試看!  Let's try something.
6   1   2481    cmn spa 我們試試看!  ¡Intentemos algo!
7   1   5350    cmn kor 我們試試看!  뭔가 해보자!
8   1   344899  cmn jpn 我們試試看!  やってみましょう。
9   1   345549  cmn cmn 我們試試看!  试一下吧。

鉴于数据框架如此,如果我们想要提取英日翻译,如何从TRG列转移SRC列以获得所需的输出?

170897  243583  eng jpn It's dry as dust    砂をかむように味気ないね。
1276    344899  eng jpn Let's try something.    やってみましょう。

我试过这个:

jpn = df[df['TRG LANG'] == 'jpn']
eng = df[df['TRG LANG'] == 'eng']
df2 = pd.merge(right=eng, left=jpn, on='SRC ID')[['TRG ID_x', 'TRG ID_y', 'TRG_x', 'TRG_y']].dropna()

但由于我要遍历整个数据集两次以分别创建jpn和eng,所以效率有点低。

整个数据集至少有12,000,000多行。

有更好的方法吗?有哪些替代daskpandas或其他数据框解决方案?

可以做出的一个很好的假设是,SRC ID处于运行数字,数据框顺序按SRC ID排序。

1 个答案:

答案 0 :(得分:1)

选项1
set_indexdrop=False一起使用,以便'TRG LANG'保持在数据框中,并且能够同时使用locunstack进行过滤

trg_langs = ['eng', 'jpn']
trg = ['TRG ID', 'TRG LANG', 'TRG']
df.set_index('TRG LANG', drop=False).loc[trg_langs] \
  .set_index('SRC ID', append=True)[trg].unstack(0)

          TRG ID         TRG LANG                        TRG               
TRG LANG     eng     jpn      eng  jpn                   eng            jpn
SRC ID                                                                     
1           1276  344899      eng  jpn  Let's try something.      やってみましょう。
8366      243583  170897      eng  jpn     It's dry as dust.  砂をかむように味気ないね。

选项2
您可以使用groupby.cumcount创建唯一索引,然后unstack

d1 = df.loc[
    df['TRG LANG'].isin(['eng', 'jpn']),
    ['SRC ID', 'TRG ID', 'TRG LANG', 'TRG']
].sort_values(['SRC ID', 'TRG LANG'])

d1.set_index(['SRC ID', d1.groupby('SRC ID').cumcount()]).unstack()

        TRG ID         TRG LANG                        TRG               
             0       1        0    1                     0              1
SRC ID                                                                   
1         1276  344899      eng  jpn  Let's try something.      やってみましょう。
8366    243583  170897      eng  jpn     It's dry as dust.  砂をかむように味気ないね。