2015-06-17 21 views
0

如果我看到一個&牛逼連續,大熊貓看下一行和交換價值

  1. 我將找到=真爲A.集刪除=真爲T.
  2. 的T值作爲A(副本中的值T)
  3. 設定給發現=真

如果我參見g &ç連續,

  1. 我將設置實測值=真爲G.設置除去=真對於C
  2. 交換ģ& C值

原始數據幀

df=pd.DataFrame([['A','3'],['T','4'], 
       ['A','3'],['A','4'], 
       ['G','3'],['C','4'], 
       ['T','1'] 
       ], 
       columns=['Flag','Value']) 
df['found']=False 
df['remove']=False 


print df 

    Flag Value found remove 
0 A  3 False False 
1 T  4 False False 
2 A  3 False False 
3 A  4 False False 
4 G  3 False False 
5 C  4 False False 
6 T  1 False False 

希望的數據幀

Flag Value found remove 
0 A  3 True False 
1 T  3 False True 
2 A  3 False False 
3 A  4 False False 
4 G  4 True False 
5 C  3 False True 
6 T  1 False False 

回答

1

我會創建一些臨時列來跟蹤滯後的標誌和值以及下一個標誌。然後可以直接比較:因爲要當G之後是C至交換值

df['prior_flag'] = df.Flag.shift() 
df['next_flag'] = df.Flag.shift(-1) 
df['prior_value'] = df.Value.shift() 

# Check for 'A' followed by 'T' 
df.loc[(df.Flag == 'A') & (df.next_flag == 'T'), 'found'] = True 
df.loc[(df.Flag == 'T') & (df.prior_flag == 'A'), 'remove'] = True 
df.loc[(df.Flag == 'T') & (df.prior_flag == 'A'), 'Value'] = \ 
    df.loc[(df.Flag == 'T') & (df.prior_flag == 'A'), 'prior_value'] 

# Check for 'G' followed by 'C' 
df.loc[(df.Flag == 'G') & (df.next_flag == 'C'), 'found'] = True 
df.loc[(df.Flag == 'C') & (df.prior_flag == 'G'), 'remove'] = True 
temp = df.loc[(df.Flag == 'G') & (df.next_flag == 'C'), 'Value'].values 
df.loc[(df.Flag == 'G') & (df.next_flag == 'C'), 'Value'] = \ 
    df.loc[(df.Flag == 'C') & (df.prior_flag == 'G'), 'Value'].values 
df.loc[(df.Flag == 'C') & (df.prior_flag == 'G'), 'Value'] = temp 
df.drop(['next_flag', 'prior_flag', 'prior_value'], axis=1, inplace=True) 

>>> df 
    Flag Value found remove 
0 A  3 True False 
1 T  3 False True 
2 A  3 False False 
3 A  4 False False 
4 G  4 True False 
5 C  3 False True 
6 T  1 False False 

,我創建臨時變量temp存儲中間複製值。

所有的臨時列然後被放在最後。

要查看有沒有被刪除,其餘行:

>>> df[~df.remove] 
    Flag Value found remove 
0 A  3 True False 
2 A  3 False False 
3 A  4 False False 
4 G  4 True False 
6 T  1 False False 
+0

出色答卷。我怎樣才能成對評估?因爲,我評估了0,1行,我想跳過評估​​1,2,而我想評估2,3。 – NinjaGaiden

+0

@ user3589054請參閱修訂後的響應,以僅查看那些尚未刪除的名稱。根據您的評論中的問題,很難有效地移除/停止評估第1行並直接移動到第2行。可以使用iterrows來順序評估數據框中的每一行,但這很慢,因爲新系列很多爲每一個創建。根據「評估」的含義,根據是否設置了「刪除」標誌,您可以進行昂貴的計算。 – Alexander

+0

感謝您的回覆。 爲了解決這個問題,我想添加另一個標準,例如Flag = A&NextFlag = T&Remove = False。一旦刪除設置爲真(第二行),它不應該評估,但我不知道如果並行操作或順序如果這樣做,它將無法正常工作。我擔心它會並行和獨立地進行。我很好奇如何解決這個問題 – NinjaGaiden