2017-03-28 7 views
6

मेरे पास विभिन्न प्रकार के जीनोमिक पदों के लिए डेटा की डेटा तालिका है। पदों को 3-टुपल्स ('गुणसूत्र', 'srand', स्थिति) के रूप में दर्शाया गया है कि मैं एक बहु-सूचकांक में बदल गया हूं। मेरा लक्ष्य प्रत्येक स्थिति के बारे में विभिन्न जानकारी देखना और तालिका में जोड़ना है (उदाहरण के लिए जीन नाम, आदि) मैं इसे pybedtools के साथ कर सकता हूं।मैं पांडा में बहु-अनुक्रमणिका के साथ मानचित्र का उपयोग कैसे कर सकता हूं?

df = pd.DataFrame(data={'A':range(1,8), 'B':range(1,8), 'C': range(1,8)}, 
index=pd.MultiIndex.from_tuples([('chrom1', '-', 1234), ('chrom1', '+', 5678), 
('chrom1', '+', 9876), ('chrom2', '+', 13579), ('chrom2', '+', 8497), ('chrom2', '-', 98765), 
('chrom2', '-', 76856)])) 

df.index.rename(['chrom','strand','abs_pos'], inplace=True) 

         A B C 
chrom strand abs_pos   
chrom1 -  1234  1 1 1 
     +  5678  2 2 2 
       9876  3 3 3 
chrom2 +  13579 4 4 4 
       8497  5 5 5 
     -  98765 6 6 6 
       76856 7 7 7 

मेरे मुद्दा एक बहु सूचकांक के साथ एक डेटा फ्रेम में कॉलम जोड़ने के साथ है। यह एक बहु-सूचकांक के बिना सीधे आगे लगता है: pandas - add new column to dataframe from dictionary

मेरे पास बहु-अनुक्रमणिका के अनुरूप 3-ट्यूपल कुंजी के साथ लुकअप जानकारी का एक शब्दकोश है। मैं इस डेटा को नए कॉलम के रूप में कैसे जोड़ सकता हूं?

gene_d = {('chrom1', '-', 1234) : 'geneA', ('chrom1', '+', 5678): 'geneB', 
    ('chrom1', '+', 9876): 'geneC', ('chrom2', '+', 13579): 'geneD', 
    ('chrom2', '+', 8497): 'geneE', ('chrom2', '-', 98765): 'geneF', 
    ('chrom2', '-', 76856): 'geneG'} 

मैं नक्शा की कोशिश की है, लेकिन यह पता लगाने की कि यह कैसे एक बहु सूचकांक के साथ काम करने के लिए प्राप्त करने के लिए निम्नलिखित उपज के लिए प्रतीत नहीं कर सकते हैं:

       A B C 
chrom strand abs_pos gene 
chrom1 -  1234 geneA  1 1 1 
     +  5678 geneB  2 2 2 
       9876 geneC  3 3 3 
chrom2 +  13579 geneD  4 4 4 
       8497 geneE  5 5 5 
     -  98765 geneF  6 6 6 
       76856 geneG  7 7 7 

उत्तर

5

एक vectorized दृष्टिकोण:

df['gene'] = df.index #you get the index as tuple 
df['gene'] = df['gene'].map(gene_d) 
df = df.set_index('gene', append=True) 

परिणामस्वरूप df:

       A B C 
chrom strand abs_pos gene    
chrom1 -  1234 geneA 1 1 1 
     +  5678 geneB 2 2 2 
       9876 geneC 3 3 3 
chrom2 +  13579 geneD 4 4 4 
       8497 geneE 5 5 5 
     -  98765 geneF 6 6 6 
       76856 geneG 7 7 7 
0

यह साथ बहुत सीधी-सपाट है एक लूप। नोट, यदि आप लूप पर जा रहे हैं, तो dict उपयुक्त डेटा-स्ट्रक्चर नहीं हो सकता है, शायद टुपल्स की एक सूची हो सकती है?

df1.index = pd.MultiIndex.from_tuples(df1.index) 

मूल df के साथ जुटना:

new_df = pd.concat([df, df1], axis=1).sort_values('A') 

कुछ साफ अप करें:

df1 = pd.DataFrame.from_dict(gene_d, orient='index').rename(columns={0:'gene'}) 

यह एक multindex दें:

In [14]: for k, v in gene_d.items(): 
    ...:  df.loc[k,'gene'] = v 
    ...: 

In [15]: df 
Out[15]: 
         A B C gene 
chrom strand abs_pos 
chrom1 -  1234  1 1 1 geneA 
     +  5678  2 2 2 geneB 
       9876  3 3 3 geneC 
chrom2 +  13579 4 4 4 geneD 
       8497  5 5 5 geneE 
     -  98765 6 6 6 geneF 
       76856 7 7 7 geneG 

In [16]: 
1

मेक एक dataframe में gene_d

new_df.index.rename(['chrom','strand','abs_pos'], inplace=True) 
new_df.set_index('gene', append=True) 
new_df 

          A B C 
chrom strand abs_pos gene   
chrom1 -  1234 geneA 1 1 1 
     +  5678 geneB 2 2 2 
       9876 geneC 3 3 3 
chrom2 +  13579 geneD 4 4 4 
       8497 geneE 5 5 5 
     -  98765 geneF 6 6 6 
       76856 geneG 7 7 7 
संबंधित मुद्दे

 संबंधित मुद्दे