创建数据帧组合并保留唯一的列值



我正在尝试一个类似于此链接的问题。我在第一部分得到了帮助,但在创建最终数据帧的第二部分遇到了困难。

假设一个类似的数据帧有一些变化:

import pandas
import itertools
mygenes=['ABC1', 'ABC2', 'ABC3', 'ABC4']
df = pandas.DataFrame({'Gene' : ['ABC1', 'ABC2', 'ABC3', 'ABC4','ABC5'],
'base1':[1,2,3,4,5] })
Gene  base1
0  ABC1      1            
1  ABC2      2          
2  ABC3      3          
3  ABC4      4       
4  ABC5      5    

我想获得以下最终数据帧:

base1  base2   
'ABC1', 'ABC2'    1         2        
'ABC1', 'ABC3'    1         3        
'ABC1', 'ABC4'    1         4   
'ABC1', 'ABC5'    1         5     
'ABC2', 'ABC3'    2         3         
'ABC2', 'ABC4'    2         4         
'ABC2', 'ABC5'    2         5 
'ABC3', 'ABC4'    3         4       
'ABC3', 'ABC5'    3         5    
'ABC4', 'ABC5'    4         5   

我已经成功地使用包itertools进行了如下组合:

mygenes=['ABC1', 'ABC2', 'ABC3', 'ABC4', 'ABC5']
list(combinations(mygenes,2))

目标是保持base1中每个"基因"的唯一值,并在创建组合时创建一个新列base2

您可以尝试使用crossmerge

out = df.merge(df,how='cross',suffixes = ('_1', '_2')).query('base1_1<base1_2')
Out[50]: 
Gene_1  base1_1 Gene_2  base1_2
1    ABC1        1   ABC2        2
2    ABC1        1   ABC3        3
3    ABC1        1   ABC4        4
4    ABC1        1   ABC5        5
7    ABC2        2   ABC3        3
8    ABC2        2   ABC4        4
9    ABC2        2   ABC5        5
13   ABC3        3   ABC4        4
14   ABC3        3   ABC5        5
19   ABC4        4   ABC5        5

set_index之后

out = out.set_index(['Gene_1','Gene_2'])
Out[52]: 
base1_1  base1_2
Gene_1 Gene_2                  
ABC1   ABC2          1        2
ABC3          1        3
ABC4          1        4
ABC5          1        5
ABC2   ABC3          2        3
ABC4          2        4
ABC5          2        5
ABC3   ABC4          3        4
ABC5          3        5
ABC4   ABC5          4        5

最新更新