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)
任何帮助都受到高度赞赏
看起来您想要字符串对的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)
距离的替代方案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)
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |