Получить комбинацию значений в датафрейме и реализовать функцию - PullRequest
2 голосов
/ 08 ноября 2019

Я хочу взять комбинацию значений в столбце и применить функцию к каждой комбинации. Какой самый простой способ сделать это?

Пример данных

| name | value |
|------|-------|
| 6A   | 1     |
| 6A   | 1     |
| 6A   | 1     |
| 6B   | 3     |
| 6B   | 3     |
| 6B   | 3     |
| 6C   | 7     |
| 6C   | 5     |
| 6C   | 4     |

Результат, которого я хочу Я использовал сумму в качестве функции в примере:

| pair  | result |
|-------|--------|
| 6A_6B | 4      |
| 6A_6B | 4      |
| 6A_6B | 4      |
| 6A_6C | 8      |
| 6A_6C | 6      |
| 6A_6C | 5      |
| 6B_6C | 10     |
| 6B_6C | 8      |
| 6B_6C | 7      |

Примечание Моя функция принимает в качестве параметров "pandas.Series". Например: х = серия "6А"а также y = серия "6B"

6A_6B = sum(x,y)

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

itertools.combinations

С макушки головы

from itertools import combinations

g = dict(tuple(df.groupby('name')))

pd.DataFrame([
    (f'{x}_{y}', a + b)
    for x, y in combinations(g, 2)
    for a, b in zip(g[x]['value'], g[y]['value'])
], columns=df.columns)

    name  value
0  6A_6B      4
1  6A_6B      4
2  6A_6B      4
3  6A_6C      8
4  6A_6C      6
5  6A_6C      5
6  6B_6C     10
7  6B_6C      8
8  6B_6C      7
2 голосов
/ 08 ноября 2019

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

import pandas as pd
from itertools import combinations

u = (df.assign(idx = df.groupby('name').cumcount()+1)
       .pivot(index='idx', columns='name', values='value'))
#name  6A  6B  6C
#idx             
#1      1   3   7
#2      1   3   5
#3      1   3   4

l = []
for items in combinations(u.columns, 2):
    l.append(u.loc[:, items].sum(1).to_frame('result').assign(pair='_'.join(items)))

df = pd.concat(l)

     result   pair
idx               
1         4  6A_6B
2         4  6A_6B
3         4  6A_6B
1         8  6A_6C
2         6  6A_6C
3         5  6A_6C
1        10  6B_6C
2         8  6B_6C
3         7  6B_6C
...