Как объединить два столбца идентификатора, используя R или Python, идентифицируя, какие строки принадлежат одному и тому же набору связанных идентификаторов - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть 2 столбца ID, которые создаются / собираются независимо. Я пытаюсь объединить эти два столбца идентификаторов в один, определяя, какие строки являются частью одной и той же связанной группы идентификаторов на основе любого из двух столбцов идентификаторов. Я бы посчитал строки связанными, основываясь на нескольких правилах:

1: Если у LOAN одинаковое значение в нескольких строках, они принадлежат одной и той же группе (в примере только для справки.) I ' мы назвали это loan_group. Здесь нет проблем.

2: Если COLLATERAL имеет одинаковое значение в нескольких строках, они принадлежат временной группе. Я назвал это collabo_group (то же правило, что и # 1). Здесь нет проблем.

3: Наконец, и я не уверен, как точно сформулировать это, но в любое время есть совпадения между значениями, которые входящие в одну и ту же группу (по столбцам ссуды и обеспечения), эти группы следует дополнительно консолидировать. Например:

df <- data.frame('LOAN' = c('L1', 'L2', 'L5', 'L2', 'L6', 'L7', 'L8'),
                 'COLLATERAL' = c('C1', 'C1', 'C8', 'C4', 'C8', 'C9', 'C4'))
df$laon_group <- as.numeric(factor(df$LOAN))
df$collateral_group <- as.numeric(factor(df$COLLATERAL))
df$final_grouping <- NA
LOAN  COLLATERAL  loan_group  collateral_group  final_grouping
----  ----------- ----------  ----------------  --------------
L1    C1*         1           1                 **1**
L2**  C1*         2           1                 **1**
L5    C8          3           2                 2
L2**  C4***       2           3                 **1**
L6    C8          4           2                 2
L7    C9          5           4                 3
L8    C4***       6           3                 **1**

*, поскольку строки 1 и 2 имеют значение C1, они будут назначены в одну и ту же конечную группу

**, поскольку строка 2 имеет LOAN значение L2, это означает, что мы можем присвоить строке 4 окончательную группировку '1', потому что эта строка может быть связана обратно со строкой 1 через ссылку L2 / C1

*** наконец, потому что строка 4 включает в себя COLLATERAL значение C4, это означает, что мы можем включить строку 7 в консолидированную окончательную группировку. Эта строка может быть связана с первой строкой через ссылки L2 / C4 & L2 / C1

Набор данных составляет примерно 15 м уникальных комбинаций LOAN + COLLATERAL. В некоторых крайних случаях группы, вероятно, будут пересекать несколько тысяч (возможно, +10 тысяч) идентификаторов. Я столкнулся с некоторыми проблемами с ресурсами при тестировании BQ некоторых решений, включая предложения из моего первоначального вопроса , поэтому я хотел бы попытаться сделать это в R / Python вместо

1 Ответ

1 голос
/ 13 февраля 2020

Если вы рассматриваете это как проблему с графиком, вы можете сделать что-то вроде:

library(igraph)

g <- make_empty_graph(directed = FALSE, n = nrow(tab))

for (loan_id in unique(tab$loan)) {
    loan_idx = which(tab$loan == loan_id)
    if (length(loan_idx) >= 2) {
        g <- g + path(loan_idx)
    }
}

for (collateral_id in unique(tab$collateral)) {
    collateral_idx = which(tab$collateral == collateral_id)
    if (length(collateral_idx) >= 2) {
        g <- g + path(collateral_idx)
    }
}

tab$grouping = components(g)$membership

, т.е. вы создаете график и добавляете ребра между строками с соответствующими идентификаторами ссуды или обеспечения. Я не уверен, насколько это оптимизировано, поскольку циклы for в R редко бывают правильным ответом.

Вывод соответствует ожидаемому выводу:

> tab
  loan collateral loan_group collateral_group final grouping
1   L1         C1          1                1     1        1
2   L2         C1          2                1     1        1
3   L5         C8          3                2     2        2
4   L2         C4          2                3     1        1
5   L6         C8          4                2     2        2
6   L7         C9          5                4     3        3
7   L8         C4          6                3     1        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...