Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Подсчет количества дубликатов

#python


имеется список параметров объекта, например:

N         Событие                   Исход     
123213    Реал Мадрид-Барселона       1
123214    Фиорентина-Аталанта         X
123213    Реал Мадрид-Барселона       2
123213    Реал Мадрид-Барселона       1
123215    Венеция-Перуджа             X
123213    Реал Мадрид-Барселона       1


Необходимо посчитать количество дубликатов.
Ожидается, получить что-то вроде этого:

N         Событие                   1   X   2
123213    Реал Мадрид-Барселона     3   0   1
123214    Фиорентина-Аталанта       0   1   0
123215    Венеция-Перуджа           0   1   0


Можно конечно создать список списков (список кортежей и т.д), и при добавлении в
него, проверять есть ли полностью идентичный набор, если нет, то добавлять.
А потом подсчитать разновидности наборов.

Может есть более элегантный способ? Может как-то с помощью dataframe в pandas
    


Ответы

Ответ 1



Попытался с помощью Pandas получить требуемый результат. Входные данные поместил в CSV и считывал оттуда: N,Событие,Исход 123213,Реал Мадрид-Барселона,1 123214,Фиорентина-Аталанта,X 123213,Реал Мадрид-Барселона,2 123213,Реал Мадрид-Барселона,1 123215,Венеция-Перуджа,X 123213,Реал Мадрид-Барселона,1 Код: import pandas as pd df = pd.read_csv('events.csv') res = (df.groupby(['N', 'Событие'])['Исход'] .value_counts() .unstack() .reset_index() .fillna(0) .astype({'1': int, 'X': int, '2': int}) .reindex(columns=['N', 'Событие', '1', 'X', '2'])) res Результат: Исход N Событие 1 X 2 0 123213 Реал Мадрид-Барселона 3 0 1 1 123214 Фиорентина-Аталанта 0 1 0 2 123215 Венеция-Перуджа 0 1 0 Для перевода в проценты: res.loc[:, '1':] = (res.loc[:, '1':] .div(res.loc[:, '1':].sum(axis=1), axis=0) .mul(100).astype(int)) res Результат: Исход N Событие 1 X 2 0 123213 Реал Мадрид-Барселона 75 0 25 1 123214 Фиорентина-Аталанта 0 100 0 2 123215 Венеция-Перуджа 0 100 0 При сохранении, например в CSV, индекс (столбец "Исход") можно не записывать: res.to_csv('output.csv', index=False)

Ответ 2



pandas.crosstab: import pandas as pd d = '''123213 Реал Мадрид-Барселона 1 123214 Фиорентина-Аталанта X 123213 Реал Мадрид-Барселона 2 123213 Реал Мадрид-Барселона 1 123215 Венеция-Перуджа X 123213 Реал Мадрид-Барселона 1''' lol = [] for l in d.splitlines(): t = l.rstrip().split() lol.append([t[0], ' '.join(t[1:-1]), t[-1]]) print(f'Список списков: {lol}\n') df = pd.DataFrame(lol, columns=['N', 'Событие', 'Исход']) print(f'Вход:\n{df}\n') df = pd.crosstab([df['N'], df['Событие']], df['Исход']).rename_axis(None, axis=1).reset_index() print(f'Посчитали исходы и перевернули:\n{df}\n') print(f'Колонки: {df.columns.tolist()}\n') print(f'Список списков: {df.values.tolist()}') Результат: Список списков: [['123213', 'Реал Мадрид-Барселона', '1'], ['123214', 'Фиорентина-Аталанта','X'], ['123213', 'Реал Мадрид-Барселона', '2'], ['123213', 'Реал Мадрид-Барселона', '1'], ['123215', 'Венеция-Перуджа', 'X'], ['123213', 'Реал Мадрид-Барселона', '1']] Вход: N Событие Исход 0 123213 Реал Мадрид-Барселона 1 1 123214 Фиорентина-Аталанта X 2 123213 Реал Мадрид-Барселона 2 3 123213 Реал Мадрид-Барселона 1 4 123215 Венеция-Перуджа X 5 123213 Реал Мадрид-Барселона 1 Посчитали исходы и перевернули: N Событие 1 2 X 0 123213 Реал Мадрид-Барселона 3 1 0 1 123214 Фиорентина-Аталанта 0 0 1 2 123215 Венеция-Перуджа 0 0 1 Колонки: ['N', 'Событие', '1', '2', 'X'] Список списков: [['123213', 'Реал Мадрид-Барселона', 3, 1, 0], ['123214', 'Фиорентина-Аталанта', 0, 0, 1], ['123215', 'Венеция-Перуджа', 0, 0, 1]]

Ответ 3



Если каждая такая строчка (123213 Реал Мадрид-Барселона 1) - это объект в списке, то можно сделать из этого списка set(), а потом методом списка count подсчитать количество каждой строки в исходном списке map(lambda x: (x, data_list.count(x)), data_set) Только если этот список не очень большой)

Комментариев нет:

Отправить комментарий