Количество уникальных пар в одном столбце - панды - PullRequest
0 голосов
/ 05 ноября 2018

У меня небольшая проблема с производством статистики для моего фрейма данных в пандах. Мой фрейм данных выглядит так (я опускаю индекс):

id    type  
1      A
2      B
3      A
1      B
3      B
2      C
4      B
4      C

Что важно, каждый id имеет два назначенных значения type, как видно из приведенного выше примера. Я хочу подсчитать все вхождения type комбинаций (поэтому подсчитать количество уникальных id с заданной type комбинацией), поэтому я хочу получить такой фрейм данных:

type    count
A, B      2
A, C      0
B, C      2

Я пытался использовать groupby разными способами, но тщетно. Я могу сделать такой подсчет, используя for-loop и несколько строк кода, но я считаю, что должно быть элегантное и правильное (с точки зрения Python) решение этой проблемы.

Заранее благодарим за любые подсказки.

Ответы [ 4 ]

0 голосов
/ 05 ноября 2018

Возможно использование unique, обратите внимание только на два уникальных значения в пределах одного идентификатора

df.groupby('id').type.unique().apply(tuple).value_counts()
Out[202]: 
(A, B)    2
(B, C)    2
Name: type, dtype: int64
0 голосов
/ 05 ноября 2018

Использование Counter, groupby и конструктор по умолчанию

from collections import Counter
>>> pd.DataFrame(Counter([tuple(v.type.values) for _,v in df.groupby('id')]), index=['Count']).T

        Count
A   B   2
B   C   2
0 голосов
/ 05 ноября 2018

Использование GroupBy + apply с value_counts:

from itertools import combinations

def combs(types):
    return pd.Series(list(combinations(sorted(types), 2)))

res = df.groupby('id')['type'].apply(combs).value_counts()

print(res)

(A, B)    2
(B, C)    2
Name: type, dtype: int64
0 голосов
/ 05 ноября 2018

pd.value_counts и itertools.combinations

from itertools import combinations

pd.value_counts(
    [(x, y) for _, d in df.groupby('id') for x, y in combinations(d.type, 2)]
)

(A, B)    2
(B, C)    2
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...