【问题标题】:How can I calculate sequences of contact events?如何计算接触事件的序列?
【发布时间】:2022-08-02 17:53:07
【问题描述】:

我有一个代表肿瘤之间接触事件的数据集。数据集按“base-cell”分组,然后按“Neighbor-cell”和“Time-frame”排序,如下所示:

index base-cell neighbor-cell timeframe
0 Track_1 Track_4 1
1 Track_1 Track_4 2
2 Track_1 Track_4 3
3 Track_1 Track_4 4
4 Track_1 Track_4 8
5 Track_1 Track_4 9
6 Track_1 Track_4 10
7 Track_1 Track_6 1
8 Track_1 Track_6 2

因为数据框是按基础肿瘤分组的,所以我有多个带有上升基础肿瘤的数据框。

我试图得到的最终结果是一个包含所有轨道的字典,其中包含一个包含所有轨道的字典,其中所有轨道都有一个接触事件,然后它们包含一个帧列表,其中有一系列接触事件.它看起来像这样:

{Track_1: {Track_4: [[1,4], [8,10], 
           Track_6: [[1,2]]},
 Track_2: {Track_5: [[10, 14], [20, 25], [28, 31]}}

到目前为止,我所做的是,我制作了一个额外的列,如果有序列,则显示 1,如果没有接触事件序列,则显示 0。

def get_sequence(df):
    
    for id, grp in df:
        prev_id = grp[\'id_2\'].shift(1).fillna(0)
        prev_frame = grp[\'FRAME\'].shift(1)
        
        conditions = [
            ((grp[\'id_2\'] == prev_id) & 
            (grp[\'FRAME\']) - prev_frame == 1)
        ]

        
        choises = [1]
        
        grp[\'sequence\'] = np.select(conditions, choises, default=0)
        print(grp)

现在我被卡住了,不知道我是否朝着正确的方向前进,如果是,下一步该如何走。

    标签: python sequence


    【解决方案1】:

    这是一种方法:

    # Identify continuous timeframes.
    df['consec'] = df.groupby(['base-tumor', 'neighbor-tumor'])['timeframe'].transform(lambda s: s.diff().ne(1).cumsum())
    
    # Get timeframe intervals.
    t_df = (df.groupby(['base-tumor', 'neighbor-tumor', 'consec']).
            agg(t_start=('timeframe', 'first'), t_end=('timeframe', 'last')).
            droplevel(-1)
           )
    t_df = t_df[t_df['t_start'].ne(t_df['t_end'])]
    t_df['interval'] = list(zip(t_df['t_start'], t_df['t_end']))
    
    # Convert to dictionary.
    result = {k: g.droplevel(0)['interval'].groupby(level=0).agg(list).to_dict()
              for k, g in t_df.drop(columns=['t_start', 't_end']).groupby(level=0)}
    
    print(result)
    
    {'Track_1': {'Track_4': [(1, 4), (8, 10)], 'Track_6': [(1, 2)]}}
    

    【讨论】:

    • 太感谢了!这非常有帮助。唯一的问题是,它现在还将与另一条轨道接触过一次的轨道识别为一个序列。例如。如果它在时间帧 6 中,则输出为 [6, 6],因为它既是它的第一个时间帧,也是最后一个时间帧。理想情况下,如果一个轨道与另一轨道仅接触一次,它不会显示在输出中。
    • @dennisvlaar 我编辑了代码,看看现在是否有效! (在创建interval 列之前添加了一行)
    • 是的!!非常感谢!我会将此标记为已回答。
    猜你喜欢
    • 2014-08-03
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多