给定一个数据框,其中第一列链接到第3列和第5列,第2列链接到第4列和第6列。列是:
SRC
列的唯一索引TRG
列的唯一索引SRC
列的语言TRG
列的语言SRC LANG
TRG LANG
注意:SRC
和TRG
是彼此的翻译。
在代码中:
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多行。
有更好的方法吗?有哪些替代dask
,pandas
或其他数据框解决方案?
可以做出的一个很好的假设是,SRC ID
处于运行数字,数据框顺序按SRC ID
排序。
答案 0 :(得分:1)
选项1
将set_index
与drop=False
一起使用,以便'TRG LANG'
保持在数据框中,并且能够同时使用loc
和unstack
进行过滤
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. 砂をかむように味気ないね。