Как кумулятивно связать значения между строками и столбцами в Pandas Dataframe? - PullRequest
1 голос
/ 23 октября 2019

У меня есть Pandas DataFrame, где каждая строка представляет собой связь между двумя уникальными точками (исходной и целевой) внутри линий. Линии могут быть разделены только на две части, но они никогда не сливаются:

   SOURCE_ID   TARGET_ID   Splitting_event 
0  1           68          False
1  68          72          False 
2  72          75          False 
3  75          81          True 
4  75          78          True 
5  78          557         False 
6  81          85          False 
7  85          88          True 
8  85          91          True 
9  88          298         False 
10 91          99          False 
11 99          106         False 
12 106         112         True 
13 106         109         True 

Я хочу соединить идентификаторы источника событий разделения таким образом, чтобы я мог отслеживать историю каждой линии.

Например, глядя на строку 13, идеальное значение для дополнительного столбца "Lineage" будет выглядеть примерно так:

   SOURCE_ID   TARGET_ID   Splitting_event  Lineage
13 106         109         True             "75.85.106" 

До сих пор все мои попытки вложенных циклов и условных выражений потерпели неудачуи я не знаю, как все соединить, используя промежуточные ссылки (те, где Splitting_event = False). Буду очень признателен за любую помощь с этим!

Большое спасибо!

1 Ответ

0 голосов
/ 23 октября 2019

Нам нужно использовать функциональность df.apply для панд

def fn_apply(x):
    num = x.SOURCE_ID
    if x.SPLITTING_EVENT:
        lineage = [str(num)]
    else:
        lineage=[]
    while True:
        y = df.loc[df['TARGET_ID'] == num,:]
        if y.empty:
            break
        if y.SPLITTING_EVENT.values[0]:
            lineage.append(str(y.SOURCE_ID.values[0]))
        num = y.SOURCE_ID.values[0]
    if lineage:
        return ".".join(reversed(lineage))
    else:
        return None
df['lineage'] = df.apply(fn_apply, axis=1)
df
    SOURCE_ID   TARGET_ID   SPLITTING_EVENT     lineage
0   1           68          False               None
1   68          72          False               None
2   72          75          False               None
3   75          81          True                75
4   75          78          True                75
5   78          557         False               75
6   81          85          False               75
7   85          88          True                75.85
8   85          91          True                75.85
9   88          298         False               75.85
10  91          99          False               75.85
11  99          106         False               75.85
12  106         112         True                75.85.106
13  106         109         True                75.85.106

Дайте мне знать, если это то, что вы хотели

...