找出每两行pandas data.frame 的字符串之间的差异

LDT*_*LDT 6 python string pandas difference

我是 Python 新手,我为此苦苦挣扎了一段时间。我有一个看起来像这样的文件:

    name   seq
1   a1     bbb
2   a2     bbc
3   b1     fff
4   b2     fff
5   c1     aaa
6   c2     acg
Run Code Online (Sandbox Code Playgroud)

其中 name 是字符串的名称, seq 是字符串。我想要一个新的列或一个新的数据框,它指示每两行之间没有重叠的差异数。例如,我想要名称 [a1-a2] 然后是 [b1-b2] 以及最后在 [c1-c2] 之间的序列之间的差异数。

所以我需要这样的东西:

    name   seq   diff  
1   a1     bbb    NA   
2   a2     bbc    1
3   b1     fff    NA
4   b2     fff    0
5   c1     aaa    NA
6   c2     acg    2
Run Code Online (Sandbox Code Playgroud)

任何帮助都受到高度赞赏

yat*_*atu 5

看起来您想要字符串对的jaccard 距离。这是使用groupbyand的一种方法scipy.spatial.distance.jaccard

from scipy.spatial.distance import jaccard
g = df.groupby(df.name.str[0])

df['diff'] = [sim for _, seqs in g.seq for sim in 
              [float('nan'), jaccard(*map(list,seqs))]]
Run Code Online (Sandbox Code Playgroud)
print(df)

  name  seq  diff
1   a1  bbb   NaN
2   a2  bbc   1.0
3   b1  fff   NaN
4   b2  fff   0.0
5   c1  aaa   NaN
6   c2  acg   2.0
Run Code Online (Sandbox Code Playgroud)

  • 赞成你的两个答案,因为你对字符串距离测量(?)和代码片段效率的了解给我留下了深刻的印象 (2认同)

ank*_*_91 5

距离的替代方案Levenshtein

import Levenshtein
s = df['name'].str[0]
out = df.assign(Diff=s.drop_duplicates(keep='last').map(df.groupby(s)['seq']
                    .apply(lambda x: Levenshtein.distance(x.iloc[0],x.iloc[-1]))))
Run Code Online (Sandbox Code Playgroud)
  name  seq  Diff
1   a1  bbb   NaN
2   a2  bbc   1.0
3   b1  fff   NaN
4   b2  fff   0.0
5   c1  aaa   NaN
6   c2  acg   2.0
Run Code Online (Sandbox Code Playgroud)