为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕虎7371278 2022-10-06 18:49:07
我是python新手,我为此苦苦挣扎了一段时间。我有一个看起来像这样的文件:    name   seq1   a1     bbb2   a2     bbc3   b1     fff4   b2     fff5   c1     aaa6   c2     acg其中 name 是字符串的名称,seq 是字符串。我想要一个新列或一个新数据框来指示每两行之间没有重叠的差异数量。例如,我想要名称 [a1-a2] 然后 [b1-b2] 和最后 [c1-c2] 之间的序列之间的差异数。所以我需要这样的东西:    name   seq   diff  1   a1     bbb    NA   2   a2     bbc    13   b1     fff    NA4   b2     fff    05   c1     aaa    NA6   c2     acg    2非常感谢任何帮助
查看完整描述

4 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

看起来您想要字符串对的杰卡德距离groupby这是使用and的一种方法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))]]

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


查看完整回答
反对 回复 2022-10-06
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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]))))

  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


查看完整回答
反对 回复 2022-10-06
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

作为第一步,我使用以下方法重新创建了您的数据:


#!/usr/bin/env python3

import pandas as pd


# Setup

data = {'name': {1: 'a1', 2: 'a2', 3: 'b1', 4: 'b2', 5: 'c1', 6: 'c2'}, 'seq': {1: 'bbb', 2: 'bbc', 3: 'fff', 4: 'fff', 5: 'aaa', 6: 'acg'}}

df = pd.DataFrame(data)

解决方案 您可以尝试迭代数据框并将seq最后一次迭代的值与当前迭代值进行比较。为了比较两个字符串(存储在数据框的seq列中),您可以应用一个简单的列表推导,如在此函数中:


def diff_letters(a,b):

    return sum ( a[i] != b[i] for i in range(len(a)) )

迭代 Dataframe 行


diff = ['NA']


row_iterator = df.iterrows()

_, last = next(row_iterator)


# Iterate over the df get populate a list with result of the comparison

for i, row in row_iterator:

    if i % 2 == 0:

        diff.append(diff_letters(last['seq'],row['seq']))

    else:

        # for odd row numbers append NA value

        diff.append("NA")

    last = row

df['diff'] = diff

结果看起来像这样


  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


查看完整回答
反对 回复 2022-10-06
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

检查这个


import pandas as pd


data = {'name':  ['a1', 'a2','b1','b2','c1','c2'],

    'seq': ['bbb', 'bbc','fff','fff','aaa','acg']

    }


df = pd.DataFrame (data, columns = ['name','seq'])

diffCntr=0

df['diff'] = np.nan

i=0

while i < len(df)-1:

    diffCntr=np.nan

    item=df.at[i,'seq']

    df.at[i,'diff']=diffCntr

    diffCntr=0

    for j in df.at[i+1,'seq']:

        if item.find(j) < 0:

            diffCntr +=1

    df.at[i+1,'diff']=diffCntr

    i +=2    

df  

结果是这样的:


    name seq    diff

0   a1   bbb    NaN

1   a2   bbc    1.0

2   b1   fff    NaN

3   b2   fff    0.0

4   c1   aaa    NaN

5   c2   acg    2.0


查看完整回答
反对 回复 2022-10-06
  • 4 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号