2017-12-16 9 views
2

を使ってパンダのオブジェクト列は、このテーブルを考えるとスライス:私はposition + 1position - 1間の配列の一部をスライスしたい他の列

uniprots = pd.DataFrame({'position': [3,4,6,3,2], 'amino_var': ['A', 'G', 'I', 'C', 'V'], 'sequence': ['MWSWKCLLFWA', 'MWSWKCLLFWH', 'MWSWKCLFLVH', 'MWSWVESFLVH', 'MWEQAQPWGAH']}) 

:あなたはこのデータフレームを構築することができます

╔═══╦══════════╦═══════════╦═════════════╗ 
║ ║ position ║ amino_var ║ sequence ║ 
╠═══╬══════════╬═══════════╬═════════════╣ 
║ 0 ║ 3  ║ A   ║ MWSWKCLLFWA ║ 
║ 1 ║ 4  ║ G   ║ MWSWKCLLFWH ║ 
║ 2 ║ 6  ║ I   ║ MWSWKCLFLVH ║ 
║ 3 ║ 3  ║ C   ║ MWSWVESFLVH ║ 
║ 4 ║ 2  ║ V   ║ MWEQAQPWGAH ║ 
╚═══╩══════════╩═══════════╩═════════════╝ 

かをたとえば、の文字をamino_varの文字に置き換えます。

私はこの試みた:

uniprots.sequence.str[uniprots.position - 1 : uniprots.position + 1] 

をしかし、私はNaNをの完全なシリーズを取得します。私はあなたが範囲の位置の前に、その範囲で最初の抽出値が必要と考えてい

╔═══╦════════╗ 
║ ║ output ║ 
╠═══╬════════╣ 
║ 0 ║ WAW ║ 
║ 1 ║ SGK ║ 
║ 2 ║ KIL ║ 
║ 3 ║ WCW ║ 
║ 4 ║ MVE ║ 
╚═══╩════════╝ 
+0

したがって、ここではユニプロットとアミノは使用されていません。わかりやすくするために質問から除外できました。また、あなたは-5から+5を望んでいますが、あなたの試みでは-1と+1を書いています。 – rnso

+1

1)あなたの質問を修正してください... 2)期待される出力を提供してください。 –

+0

完了!フィードバックをお寄せいただきありがとうございます。 – marlanbar

答えて

2

このためDataFrame.applyを使用することができます。

def get_subsequence(row, width=1): 
    seq = row['sequence'] 
    pos = row['position']-1 
    return seq[pos-width:pos] + row['amino_var'] + seq[pos+1:pos+width+1] 

uniprots['sequence'] = uniprots.apply(get_subsequence, axis=1)

私たちは、その後、取得:

>>> uniprots.apply(get_subsequence, axis=1) 
0 WAW 
1 SGK 
2 KIL 
3 WCW 
4 MVE 
dtype: object 

我々は、より大きなスパンをしたい場合は、我々はfunctools.partialと、たとえば、widthパラメータを設定することができます。

from functools import partial 

uniprots['sequence'] = uniprots.apply(partial(get_subsequence, width=3), axis=1)

結果は次のとおりです。

>>> uniprots.apply(partial(get_subsequence, width=3), axis=1) 
0  AWKC 
1 MWSGKCL 
2 SWKILFL 
3  CWVE 
4  VEQA 

文字列の長さが等しくない理由は、文字列の境界に当たったためです。ワンライナーでも動作後

+0

長さが文字列の境界に当たった場合、できるだけ遠くに行くのではなく、単にエラーを起こすのではなく、その部分をスキップするのはなぜですか? – marlanbar

+1

@marlanbar:これは、スライスが文字列(そして大部分/全てがPythonオブジェクトに組み込まれている)のためにどのように実装されているかを示しています。文字列 ''foobar' [123:456]'のスライスは空文字列です。場合によっては、エラーを発生させることが本当に意味をなさないでしょう。 –

2

replaceや範囲の後にすべての値は続か:私の予想される出力は次のようになり

:編集した答えによって

print (uniprots) 
    uniprot position amino amino_var  sequence 
0 P11362   3  W   A WWWWWWWWWWW 
1 P11362   4  E   G MEEEEEELFWH 
2 P11362   6  N   I MWSWKCNNLVH 
3 P11362   3  S   C MWSWVESFLVH 
4 P11362   3  W   V MWEQAQPWGAH 

N = 2 
def repl(x): 
    s = x['sequence'] 
    p = x['position'] 
    a1 = x['amino'] 
    a2 = x['amino_var'] 
    return s[:p-N-1] + s[p-N-1:p+N].replace(a1,a2) +s[p+N:] 

uniprots['sequence'] = uniprots.apply(repl, axis=1) 
print (uniprots) 
    uniprot position amino amino_var  sequence 
0 P11362   3  W   A AAAAAWWWWWW 
1 P11362   4  E   G MGGGGGELFWH 
2 P11362   6  N   I MWSWKCIILVH 
3 P11362   3  S   C MWCWVESFLVH 
4 P11362   3  W   V MVEQAQPWGAH 

EDITを

抽出値とカラムamino_varとの結合:

N = 1 
a = uniprots.apply(lambda x: x['sequence'][x['position']-N-1 : x['position']-1] , axis=1) 
b = uniprots.apply(lambda x: x['sequence'][x['position'] : x['position']+N] , axis=1) 

uniprots['sequence'] = a + uniprots['amino_var'] + b        
print (uniprots) 
    position amino_var sequence 
0   3   A  WAW 
1   4   G  SGK 
2   6   I  KIL 
3   3   C  WCW 
4   2   V  MVE 
0

uniprots['output'] = uniprots.apply(lambda x: x['sequence'][x['position']-1-1] +x['amino_var']+x['sequence'][x['position']-1+1], axis=1) 

をフォーマット後は、より読みやすいです:

uniprots['output'] = uniprots.apply(lambda x: 
      x['sequence'][x['position']-1-1] + 
      x['amino_var'] + 
      x['sequence'][x['position']-1+1], axis=1) 

出力:

print(uniprots) 
    amino_var position  sequence output 
0   A   3 MWSWKCLLFWA WAW 
1   G   4 MWSWKCLLFWH SGK 
2   I   6 MWSWKCLFLVH KIL 
3   C   3 MWSWVESFLVH WCW 
4   V   2 MWEQAQPWGAH MVE 

'位置' の値は、この表に1からスタートPythonでは0からですので、-1を実行する必要があります。