第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

查找每?jī)尚?pandas data.frame 的字符串之間的差異

查找每?jī)尚?pandas data.frame 的字符串之間的差異

慕虎7371278 2022-10-06 18:49:07
我是python新手,我為此苦苦掙扎了一段時(shí)間。我有一個(gè)看起來(lái)像這樣的文件:    name   seq1   a1     bbb2   a2     bbc3   b1     fff4   b2     fff5   c1     aaa6   c2     acg其中 name 是字符串的名稱(chēng),seq 是字符串。我想要一個(gè)新列或一個(gè)新數(shù)據(jù)框來(lái)指示每?jī)尚兄g沒(méi)有重疊的差異數(shù)量。例如,我想要名稱(chēng) [a1-a2] 然后 [b1-b2] 和最后 [c1-c2] 之間的序列之間的差異數(shù)。所以我需要這樣的東西:    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貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊

看起來(lái)您想要字符串對(duì)的杰卡德距離。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


查看完整回答
反對(duì) 回復(fù) 2022-10-06
?
飲歌長(zhǎng)嘯

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊

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


查看完整回答
反對(duì) 回復(fù) 2022-10-06
?
鴻蒙傳說(shuō)

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

作為第一步,我使用以下方法重新創(chuàng)建了您的數(shù)據(jù):


#!/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)

解決方案 您可以嘗試迭代數(shù)據(jù)框并將seq最后一次迭代的值與當(dāng)前迭代值進(jìn)行比較。為了比較兩個(gè)字符串(存儲(chǔ)在數(shù)據(jù)框的seq列中),您可以應(yīng)用一個(gè)簡(jiǎn)單的列表推導(dǎo),如在此函數(shù)中:


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

結(jié)果看起來(lái)像這樣


  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


查看完整回答
反對(duì) 回復(fù) 2022-10-06
?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊

檢查這個(gè)


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  

結(jié)果是這樣的:


    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


查看完整回答
反對(duì) 回復(fù) 2022-10-06
  • 4 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)