Приведен типичный кадр данных 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())])
Какой самый эффективный способ завершить это преобразование?