2016-12-15 94 views
0

我有一个数据帧如下:部分Multiindexing与熊猫数据帧

df = pd.DataFrame(columns=['New Category', 'Sample1', 'Sample2'], 
     data=[ 
       ['Pathogenic/Likely Pathogenic', '0/0:240', '1/0:100'], 
       ['Likely Benign', '1/1:0,237', '1/0:700'], 
       ['Likely Benign', '0/0:239', '0/0:234'], 
       ['Likely Benign', '1/1:1,238', '0/1:890'], 
       ['Likely Benign', '0/1:156,79', '1/1:767'], 
       ['VUS', '1/1:0,241', '0/1:21'] 
       ]) 

,看起来像这样:

   New Category  Sample1 Sample2 
0 Pathogenic/Likely Pathogenic 0/0:240 1/0:100 
1     Likely Benign 1/1:237 1/0:700 
2     Likely Benign 0/0:239 0/0:234 
3     Likely Benign 1/1:238 0/1:890 
4     Likely Benign 0/1:156 1/1:767 
5       VUS 1/1:241 0/1:21 

我想要做一些multiindexing从而使样本1和样本2的值被分割由冒号放在下面作为子列名称。但是,我不希望这些子列名称应用于新类别列。基本上我希望它看起来像这样:

   New Category  Sample1 Sample2 
            GT GQ GT GQ 
0 Pathogenic/Likely Pathogenic 0/0 240 1/0 100 
1     Likely Benign 1/1 237 1/0 700 
2     Likely Benign 0/0 239 0/0 234 
3     Likely Benign 1/1 238 0/1 890 
4     Likely Benign 0/1 156 1/1 767 
5       VUS 1/1 241 0/1 21 

我真的很难过如何做到这一点。熊猫文档的multiindexing页面不包含仅在选定列上进行多重索引的示例。这使我们想知道这是否可能。

回答

1

这实际上不是“索引”的问题,而是操纵数据,特别是分割列。下面应该做的:

pd.concat([pd.DataFrame(df[['New Category']].values, 
      columns=pd.MultiIndex.from_tuples([('New Category', '')]))] + 
      [pd.DataFrame(list(df[col].str.split(':')), 
         columns=pd.MultiIndex.from_product([[col], 
                  ['GT', 'GQ']])) 
      for col in ['Sample1', 'Sample2']], 
      axis=1) 

请注意,您可以分裂一次全部(即不每一列上环),如如下:

df[['Sample1', 'Sample2']].applymap(lambda s : s.split(':')) 

...但

  • 这样会比较慢,因为您在每个单元格上隐式循环
  • 您仍然需要另一个循环来提取单个新创建的列
+0

谢谢!这似乎有伎俩。然而,代码让我感到头痛,我会玩弄它直到我完全理解。 – DDRRpy

+1

确实,我在一个命令中展示了它“尽可能与索引相似”,但我不建议在您的代码库中使用这种恐怖,更好地分割它:-) –