2017-04-04 44 views
1

在大熊貓據幀:如何通過一次讀取一行來轉置熊貓數據框中的數據?

contig haplotype_block hap_X hap_Y odds_ratio My_hap Sp_hap 
2   726   C-G-C T-C-T 0.012  C-G-C T-C-T 
2   1094   G-C  A-T  0.02  A-T  G-C 
2   1335   C-T-T A-C-A 0.001  A-C-A C-T-T 
2   3353   T-T  A-C  314.5  T-T  A-C 

我要轉的數據。一個簡單的轉置就可以工作,但這有點複雜。

  • 我不需要移動列索引。
  • 基本上行數會增加。

所有,我想要做的是讀取每一行(行然後)轉置該行首先。

contig haplotype_block hap_X hap_Y odds_ratio My_hap Sp_hap 
2   726   C  T  0.012  C   T 
2   726   G  C   -   G   C 
2   726   C  T   -   C   T 
2   1094   G  A  0.02  A   G 
2   1094   C  T   -   T   C 

現在,將第3行轉置並沿行添加到上面的數據框中。

我可以使用for-loop(每次讀取每行),但我特別尋找使用熊貓數據框的解決方案,因此內存佔用以及代碼理解清晰優雅。

感謝,

回答

2

您可以使用:

from itertools import chain 

#create list by split 
cols = ['hap_X','hap_Y','My_hap','Sp_hap'] 
df[cols] = df[cols].apply(lambda x: x.str.split('-')) 

#new df with flatening lists and repeating 
lens = df.hap_X.str.len() 
df2 = pd.DataFrame({ 
     "contig": np.repeat(df.contig.values, lens), 
     "haplotype_block": np.repeat(df.haplotype_block.values, lens), 
     "hap_X": list(chain.from_iterable(df.hap_X)), 
     "hap_Y": list(chain.from_iterable(df.hap_Y)), 
     "odds_ratio": np.repeat(df.odds_ratio.values, lens), 
     "My_hap": list(chain.from_iterable(df.My_hap)), 
     "Sp_hap": list(chain.from_iterable(df.Sp_hap)) 
}).reindex_axis(df.columns, axis=1) 

#correct column odds_ratio - only first value 
s = pd.Series(np.repeat(df.index.values, lens)) 
df2.loc[s.duplicated(), 'odds_ratio'] = '-' 
print (df2) 

    contig haplotype_block hap_X hap_Y odds_ratio My_hap Sp_hap 
0  2    726  C  T  0.012  C  T 
1  2    726  G  C   -  G  C 
2  2    726  C  T   -  C  T 
3  2    1094  G  A  0.02  A  G 
4  2    1094  C  T   -  T  C 
5  2    1335  C  A  0.001  A  C 
6  2    1335  T  C   -  C  T 
7  2    1335  T  A   -  A  T 
8  2    3353  T  A  314.5  T  A 
9  2    3353  T  C   -  T  C 
相關問題