Наиболее эффективный способ преобразования фрейма данных pandas с реляционными данными в вероятностную связь - PullRequest
0 голосов
/ 25 августа 2018

Приведен типичный кадр данных pandas с "реляционными данными"

|--------------|------------|------------|
|   Column1    |  Column2   |  Column3   |
|-------- -----|------------|------------|
|    A         |      1     |     C      |
|--------------|------------|------------|
|    B         |      2     |     C      |
|--------------|------------|------------|
|    A         |      2     |     C      |
|--------------|------------|------------|
|    A         |      1     |     C      |
|--------------|------------|------------|
|    ...       |    ...     |    ...     |
|--------------|------------|------------|

Я пытаюсь вычислить вероятности между всеми значениями столбца длиной 2, то есть кортеж (A,1) --> 0.66, (A,2) --> 0.33, (B,2) --> 1, (2,B) --> 0.5 и т. Д.

Я ожидаю результата обратно в список, похожий на:

[
   [A,1,0.66],
   [A,2,0.33],
   [B,2,1],
   [2,b,0.5],
   ...
]

В настоящее время мой подход действительно неэффективен (даже при использовании многопроцессорной обработки). Упрощенно я перебираю все возможности без какого-либо Cython.

# iterating through all columns
for colname in colnames: 
    # evaluating all other columns except the one under assessment
    for x in [x for x in colnames if not x==colname]:
        # through groupby we get their counts
        groups = df.groupby([colname,x]).size().reset_index(name='counts')
        # for each group we
        for index,row in groups.iterrows():
            # calculate their probability over the entire population
            # of the column and push it in the result list
            result.append([row[colname],row[x],(row["counts"]/df[x].count())])

Какой самый эффективный способ завершить это преобразование?

...