2017-03-24 20 views
2

の列をシフトして:塗りつぶし値は私はこのように見てパンダのデータフレームを持っているパンダのデータフレーム

sequence positions 
0   -   8 
1   N   9 
2   M   10 
3   S   11 
4   L   12 
5   V   13 
6   -   14 
7   E   15 
8   T   16 
9   V   17 
10   D   18 

配列の列(アミノ酸配列)でギャップを示す文字(アミノ酸コード)とダッシュがあり、列の位置で、私はそれらのアミノ酸の位置を入れたいと思います。それらは数字のシーケンス(この場合は8から始まる)なので、range()を使用して列を生成します。しかし、この番号は、アミノに関するものであり、ギャップではありません。列の位置はダッシュで満たされ、それに応じてシフトする必要があります。

sequence positions 
0   -   - 
1   N   8 
2   M   9 
3   S   10 
4   L   11 
5   V   12 
6   -   - 
7   E   13 
8   T   14 
9   V   15 
10   D   16 

だから、私は行を反復処理し、このmodifictationをやって思ったが、パンダのマニュアルでは、それは悪いアイデアだと言います。おそらくいくつかの機能を作り、パンダapplyshiftと組み合わせると問題は解決しますが、どうやってそれを行うのか分かりません。ここで

+0

こんにちはミカルは、あなたがデータフレームでダッシュを維持する必要がありますか?そうでなければ、最初に 'sequence'からすべてのダッシュを削除し、新しい' position'カラムを 'range(0、n)'として作成することができます – VinceP

+0

ええ、それは速くて簡単ですが、この場合の全体のポイントは保存することですコードとダッシュの両方のインデックスとコードのみのインデックスを使用しています。 –

答えて

1

一つの方法である:

import pandas as pd 

# find out the dashes 
dash = df.sequence == "-" 

# assign dash to positions where sequence is dash 
df.loc[dash, "positions"] = "-" 

# assign a sequence of numbers to positions where sequence is not dash 
df.loc[~dash, "positions"] = pd.np.arange(8, (~dash).sum()+8) 

enter image description here

1

これが私の解決策では、あなたがそれを好き願っています:

df = pd.DataFrame({'sequence': ['-', 'A', 'B', 'C', '-', 'D'], 'positions': range(8, 14)}) 
seq = df['sequence'].tolist() 
pos = iter(df['positions'].tolist()) 
pos = [next(pos) if a != '-' else '-' for a in seq] 
df['positions'] = pos 

てくださいハードコーディングは、この中に何があることに注意していません溶液。

+0

「iter」を思い出してくれてありがとう。 –

1

ダッシュ"-"以外の文字列値を照会してブール値マスクを作成した後に、アクセッサーdouble .locを使用します。

df.loc[df.sequence != "-", 'positions'] = df['positions'].values 
df.loc[df.sequence == "-", 'positions'] = "-" 

enter image description here

関連する問題