亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找每兩行 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 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號