2015-06-15 65 views
3

如果我有如下所示的數據框,如何製作長格式數據框(即,每行每個基因一個術語)。如何從列中拆分字符串以創建長格式數據框

我想我將不得不apply或將split(",")映射到Term列,但接下來我該怎麼辦?

import pandas as pd 
from StringIO import StringIO 

df = pd.read_table(StringIO("""Gene Terms 
Mt-nd1 GO:0005739,GO:0005743,GO:0016021,GO:0030425,GO:0043025,GO:0070469,GO:0005623,GO:0005622,GO:0005737 
Madd GO:0016021,GO:0045202,GO:0005886 
Zmiz1 GO:0005654,GO:0043231 
Cdca7 GO:0005622,GO:0005623,GO:0005737,GO:0005634,GO:0005654"""), sep="\s+") 

Ps。上面的表格被簡化了,實際的df將有更多的列。

Psps。如果我不清楚,我想是這樣結束了:

Mt-nd1 GO:0005739 
Mt-nd1 GO:0005743 
Mt-nd1 GO:0016021 
... 
Cdca7 GO:0005634 
Cdca7 GO:0005654 

回答

4

您可以使用str.split做分裂(而不是申請和拆分的方法,但類似):

In [6]: splitted = df['Terms'].str.split(',', expand=True) 

In [7]: splitted 
Out[7]: 
      0   1   2   3   4   5 \ 
0 GO:0005739 GO:0005743 GO:0016021 GO:0030425 GO:0043025 GO:0070469 
1 GO:0016021 GO:0045202 GO:0005886   NaN   NaN   NaN 
2 GO:0005654 GO:0043231   NaN   NaN   NaN   NaN 
3 GO:0005622 GO:0005623 GO:0005737 GO:0005634 GO:0005654   NaN 

      6   7   8 
0 GO:0005623 GO:0005622 GO:0005737 
1   NaN   NaN   NaN 
2   NaN   NaN   NaN 
3   NaN   NaN   NaN 

要把它變成列(而不是列表),你可以使用expand=True關鍵字split,或較舊版本的熊貓,你可以做df['Terms'].str.split(',').apply(pd.Series)獲得相同。現在

,以獲得您想要的輸出,我們必須堆疊這些列,但先用基因柱將其融合在堆疊幀這樣的信息:

In [14]: stacked = pd.concat([df['Gene'], splitted],axis=1).set_index('Gene').stack() 
In [15]: stacked 
Out[15]: 
Gene 
Mt-nd1 0 GO:0005739 
     1 GO:0005743 
     2 GO:0016021 
     3 GO:0030425 
     4 GO:0043025 
     5 GO:0070469 
     6 GO:0005623 
     7 GO:0005622 
     8 GO:0005737 
Madd 0 GO:0016021 
     1 GO:0045202 
     2 GO:0005886 
Zmiz1 0 GO:0005654 
     1 GO:0043231 
Cdca7 0 GO:0005622 
     1 GO:0005623 
     2 GO:0005737 
     3 GO:0005634 
     4 GO:0005654 
dtype: object 

從這裏,我們可以重新索引,用術語命名我們的專欄,並刪除整數列(從自動生成的列名),我們不需要了:

In [19]: stacked.rename(columns={0:'Term'}).drop('level_1', axis=1) 
Out[19]: 
     Gene  Term 
0 Mt-nd1 GO:0005739 
1 Mt-nd1 GO:0005743 
2 Mt-nd1 GO:0016021 
3 Mt-nd1 GO:0030425 
4 Mt-nd1 GO:0043025 
5 Mt-nd1 GO:0070469 
6 Mt-nd1 GO:0005623 
7 Mt-nd1 GO:0005622 
8 Mt-nd1 GO:0005737 
9  Madd GO:0016021 
10 Madd GO:0045202 
11 Madd GO:0005886 
12 Zmiz1 GO:0005654 
13 Zmiz1 GO:0043231 
14 Cdca7 GO:0005622 
15 Cdca7 GO:0005623 
16 Cdca7 GO:0005737 
17 Cdca7 GO:0005634 
18 Cdca7 GO:0005654 

這可怎麼結合或與你有其他列合併,將取決於關於你到底想做什麼。

+1

好知道'擴大= TRUE;(PD> = 0.16.1) – UNagaswamy

+0

@joris在16.2這個答案不工作!獲得'重命名有一個意外的參數列'。這是最後一個不起作用的命令。 –

+0

的修復只是'stacked.reset_index()重命名(列= {0: '期限'})降( 'LEVEL_1',軸線= 1)' - 也就是說,reset_index()''添加到最後一個命令。! –

相關問題