2017-09-17 73 views
1

我有一個數據幀[「阿魯」]是這樣的:爲什麼我不能在熊貓中將列分成兩列?

df.anno 

0   type I secretion outer membrane protein, TolC... 
1   conserved hypothetical protein [Shigella boyd... 
2    Transposase [Congregibacter litoralis KT71] 
3   Chain A, The Crystal Structure Of Chlorite Di... 
4   chlorite dismutase, partial [uncultured bacte... 
5   carbamoyl-phosphate synthase, small subunit [... 
6   anthranilate synthase component 1 [endosymbio... 
7   chlorite dismutase, partial [bacterium enrich... 
8   peptidase dimerization domain protein [Myroid... 
9   MULTISPECIES: MFS transporter [Enterobacteria... 
10  CAAX amino terminal protease family protein [... 
11  Fe-S oxidoreductase [Desulfovibrio africanus ... 
12  phosphoenolpyruvate synthase/pyruvate phospha... 

因爲有兩個部分的每一行中:1:蛋白名稱。 2.具有'[......]'的微生物物種。

我想提取蛋白質名稱部分並丟棄微生物物種,所以我決定首先將該列分成兩列,位置爲'[''。

df2 = pd.DataFrame(df.anno.str.split("[", 1).tolist(), columns = ['protein','species']) 

它返回一個錯誤:

TypeError: object of type 'NoneType' has no len() 

我也試過:

df[['protein','species']] = df['anno'].str.split('[', expand=True) 

它也返回了一個錯誤:

ValueError: Columns must be same length as key 

如何做到這一點?有沒有其他的方法來提取蛋白質名稱? 謝謝!

回答

0

我覺得有問題多個[,所以加了n=1split先分開了[。對於刪除最後]使用rstrip

df[['protein','species']] = df['anno'].str.rstrip(']').str.split('[', expand=True, n=1) 

對於帶材通過最後[使用rsplit

df[['protein','species']] = df['anno'].str.rstrip(']').str.rsplit('[', expand=True, n=1) 

extract另一種解決方案用於提取由過去[]

df[['protein','species']] = df['anno'].str.extract('(.*)\[(.*)\]', expand=True) 

樣品:

df[['protein','species']] = df['anno'].str.rstrip(']').str.split('[', expand=True, n=1) 
df['species'] = df['species'].str.replace('\]\[',',') 
df['protein'] = df['protein'].str.strip() 
print (df) 
       anno  protein species 
0  protein [q][sd]  protein q,sd 
1    protein  protein None 
2 Transposase [KT71] Transposase KT71 
3    None   None None 
+0

非常感謝。有效!一個問題:對於行[3],其值如下:'鏈A,亞氯酸鹽歧化酶的晶體結構:產生分子氧的排毒酶' 它沒有物種名稱。如果我運行這個命令,它會給我帶來「蛋白質」和「物種」的NaN。如果我想保留蛋白質名稱,我應該怎麼做? – stevex

+0

帶'str.split'的解決方案應該可以工作。 – jezrael

+0

問題是該列中的某些值沒有「[物種名稱..]」。如果我使用str.extract,它將返回NaN。如果我使用str.split,它會返回錯誤。 – stevex