2017-05-23 154 views
1

我有一個DF:大熊貓多重條件,並添加多列

import pandas as pd 
df.head(20) 
          id ch  start  end strand 
0 10:100026072-100029645(+) 10 100026072 100029645  + 
1 10:110931880-110932381(+) 10 110931880 110932381  + 
2 10:110932431-110933096(+) 10 110932431 110933096  + 
3 10:111435307-111439556(-) 10 111435307 111439556  - 
4 10:115954439-115964883(-) 10 115954439 115964883  - 
5 10:115986231-116018509(-) 10 115986231 116018509  - 
6 10:116500106-116500762(-) 10 116500106 116500762  - 
7 10:116654355-116657389(-) 10 116654355 116657389  - 
8 10:117146840-117147002(-) 10 117146840 117147002  - 
9 10:126533798-126533971(-) 10 126533798 126533971  - 
10 10:127687390-127688824(+) 10 127687390 127688824  + 
11 10:19614164-19624369(-) 10 19614164 19624369  - 
12 10:42537888-42543687(+) 10 42537888 42543687  + 
13 10:61927486-61931038(-) 10 61927486 61931038  - 
14 10:70699779-70700206(-) 10 70699779 70700206  - 
15 10:76532243-76532565(-) 10 76532243 76532565  - 
16 10:79336852-79337034(-) 10 79336852 79337034  - 
17 10:79342487-79343173(+) 10 79342487 79343173  + 
18 10:79373277-79373447(-) 10 79373277 79373447  - 
19 10:82322045-82337358(+) 10 82322045 82337358  + 

df.shape 
(501, 5) 

>>>df.dtypes 
id  object 
ch  object 
start  object 
end  object 
strand object 
dtype: object 

問:

我想根據「開始」和「結束」列

率先執行多個操作創建兩個附加欄名爲

newstart newend 

desiredoperation: if strand == '+': 
        df['newstart'] = end - int(27) 
        df['newend'] = end + 2 
        elif: 
         strand == '-' 
         df['newstart'] = start - int(3) 
         df['newend'] = start + 26 

我該如何做到這一點使用熊貓,我發現鏈接belo但不知道如何執行它。如果任何人可以提供僞代碼將建立在它。 adding multiple columns to pandas simultaneously

回答

1

可以使用np.where,2線,但可讀

df['newstart'] = np.where(df.strand == '+', df.end-int(27), df.start-int(3)) 
df['newend'] = np.where(df.strand == '+', df.end+int(2), df.start+int(26)) 

    id       ch start  end  strand newstart newend 
0 10:100026072-100029645(+) 10 100026072 100029645 + 100029618 100029647 
1 10:110931880-110932381(+) 10 110931880 110932381 + 110932354 110932383 
2 10:110932431-110933096(+) 10 110932431 110933096 + 110933069 110933098 
3 10:111435307-111439556(-) 10 111435307 111439556 - 111435304 111435333 
4 10:115954439-115964883(-) 10 115954439 115964883 - 115954436 115954465 
5 10:115986231-116018509(-) 10 115986231 116018509 - 115986228 115986257 
6 10:116500106-116500762(-) 10 116500106 116500762 - 116500103 116500132 
7 10:116654355-116657389(-) 10 116654355 116657389 - 116654352 116654381 
8 10:117146840-117147002(-) 10 117146840 117147002 - 117146837 117146866 
9 10:126533798-126533971(-) 10 126533798 126533971 - 126533795 126533824 
+0

哦,我看到我需要調用numpy作爲np。對不起,我編輯了我的代碼,但我想你的答案仍然是一樣的權利? – novicebioinforesearcher

+0

你在jupyter上工作我得到這個TypeError:不支持的操作數類型爲 - 'str'和'int'' – novicebioinforesearcher

+0

所以如果我在jupyter筆記本上執行它它工作正常,但在終端上我得到上述錯誤。 – novicebioinforesearcher

1

做,如果你想這樣做的熊貓,df.loc是一個很好的候選人:

df['newstart'] = df['start'] - 3 
df['newend'] = df['start'] + 26 
subset = df['strand'] == '+' 
df.loc[subset,'newstart']=df.loc[subset,'end']-27 
df.loc[subset,'newend']=df.loc[subset,'end']+2 

我認爲繼續使用熊貓來處理數據是一個好主意:它會保持代碼的一致性,並且可能有更好,更短的方式來編寫上面的代碼。

df.loc是一個非常有用的函數來執行數據查找和處理,試圖擺弄它,因爲它是一個偉大的工具。

享受

+0

無法正常使用 – novicebioinforesearcher

+0

嗯,粘貼代碼時我肯定錯過了一些東西。我已經編輯了我的答案與工作代碼(在Python 3.5中提到)。 –