Есть ли функция для получения количества уникальных значений в кадре данных в каждой группе? - PullRequest
4 голосов
/ 30 октября 2019

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

Например, учитывая следующий кадр данных:

test_df = pd.DataFrame({
    'label': [1, 1, 1, 1, 2, 2, 3, 3, 3], 
    'value': [0, 0, 1, 2, 1, 2, 2, 3, 4]})
test_df
  label     value
0   1         0
1   1         0
2   1         1
3   1         2
4   2         1
5   2         2
6   3         2
7   3         3
8   3         4

Ожидаемый результат равен:

  label     uni_val
0   1         1 -> {0} is unique value for this label compared to other labels
1   2         0 -> no unique values for this label compared to other labels
2   3         2 -> {3, 4} are unique values for this label compared to other labels

Один из способов сделать это - получить уникальные значения для каждой метки, а затем подсчитать их не дубликаты по всем элементам.

test_df.groupby('label')['value'].unique()

label
1    [0, 1, 2]
2       [1, 2]
3    [2, 3, 4]
Name: value, dtype: object

Есть ли ещеэффективный и простой способ?

1 Ответ

2 голосов
/ 30 октября 2019

Вы можете сбросить дубликаты на ['label', 'value'], а затем сбросить дубликаты на value:

(test_df.drop_duplicates(['label','value'])         # remove duplicates on pair (label, value)
    .drop_duplicates('value', keep=False)           # only keep unique `value`
    .groupby('label')['value'].count()              # count as usual
    .reindex(test_df.label.unique(), fill_value=0)  # fill missing labels with 0
)

Вывод:

label
1    1
2    0
3    2
Name: value, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...