【问题标题】:Counting different number of combinations that exists in a column计算列中存在的不同数量的组合
【发布时间】:2020-11-05 14:11:35
【问题描述】:

我有不同长度的不同细菌的 DNA 序列,它们是字符串格式的。示例:

DNA
xx345- b324- c82- d13- c14
xx345- a22- c14- d13
a34- f12 - r27- fg98 - tr12
z23
xx345

我想计算我的数据集中每个 DNA 片段的共现次数。我需要两个输出。第一:

pair          
xx345- b324     
xx345- c82     
xx345- d13      
xx345- a22      
xx345- c14      
xx345- c14      
b324- c82       
b324- d13       
b324- c14       
c82- d13        
c82- c14        
d13- c14        
d13- c14        
a22- c14        
a22- d13        
a34- f12        
a34- r27        
a34- fg98       
a34- tr12       
f12- r27        
f12- fg98       
f12- tr12       
r27- fg98       
r27- tr12       
fg98- tr12   
z23   
xx345

然后

pair          count
xx345- b324     1
xx345- c82      1
xx345- d13      1
xx345- a22      1
xx345- c14      2
b324- c82       1
b324- d13       1
b324- c14       1
c82- d13        1
c82- c14        1
d13- c14        2
a22- c14        1
a22- d13        1
a34- f12        1
a34- r27        1
a34- fg98       1
a34- tr12       1
f12- r27        1
f12- fg98       1
f12- tr12       1
r27- fg98       1
r27- tr12       1
fg98- tr12      1
z23             1
xx345           1

【问题讨论】:

    标签: pandas combinations


    【解决方案1】:

    我相信您需要按 \s*-\s* 拆分值 - 这里 \s* 表示零个或多个空格,然后在列表理解中展平所有组合:

    from  itertools import combinations
    
    L = ['-'.join(y) for x in df['DNA'].str.split('\s*-\s*') for y in combinations(x, 2)]
    

    如果需要排序值:

    L = ['-'.join(sorted(y)) for x in df['DNA'].str.split('\s*-\s*') 
         for y in combinations(x, 2)]
    

    最后传递给Series 并调用Series.value_counts

    s = pd.Series(L)
    print (s)
    0     xx345-b324
    1      xx345-c82
    2      xx345-d13
    3      xx345-c14
    4       b324-c82
    5       b324-d13
    6       b324-c14
    7        c82-d13
    8        c82-c14
    9        d13-c14
    10     xx345-a22
    11     xx345-c14
    12     xx345-d13
    13       a22-c14
    14       a22-d13
    15       c14-d13
    16       a34-f12
    17       a34-r27
    18      a34-fg98
    19      a34-tr12
    20       f12-r27
    21      f12-fg98
    22      f12-tr12
    23      r27-fg98
    24      r27-tr12
    25     fg98-tr12
    dtype: object
    

    s1 = s.value_counts()
    print (s1)
    xx345-c14     2
    xx345-d13     2
    c14-d13       1
    f12-tr12      1
    xx345-a22     1
    a34-fg98      1
    f12-r27       1
    a34-r27       1
    c82-c14       1
    f12-fg98      1
    a22-c14       1
    a34-tr12      1
    a34-f12       1
    b324-d13      1
    r27-tr12      1
    xx345-c82     1
    d13-c14       1
    b324-c14      1
    xx345-b324    1
    r27-fg98      1
    fg98-tr12     1
    b324-c82      1
    c82-d13       1
    a22-d13       1
    dtype: int64
    

    编辑:

    from  itertools import combinations
    
    L = []
    for x in df['DNA'].str.split('\s*-\s*'):
        if len(x) > 1:
            for y in combinations(x, 2):
                L.append('-'.join(sorted(y)))
        else:
            L.append(x[0])
    
    
    s = pd.Series(L)
    print (s)
    

    【讨论】:

    • 对不起,也有单元素病毒,介意我更新一下问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多