Как найти столбцы / объекты, для которых имеется не менее X процентов строк с идентичными значениями? [Python] - PullRequest
1 голос
/ 20 октября 2019

Допустим, у меня есть очень большой набор данных с «N» строками и «М» функциями. У меня также есть два входа.

  1. 'm': определяет количество проверяемых объектов (m
  2. 'support' = идентичные строки / общее количество строк для подмножества объектов m). в основном это минимальный процент идентичных строк с учетом числа m объектов

Мне нужно вернуть группы объектов, для которых значение 'support' больше, чемпредопределенное значение.

Например, давайте возьмем этот набор данных:

d = {
     'A': [100, 200, 200, 400,400], 'B': [1,2,2,4,5],
     'C':['2018-11-19','2018-11-19','2018-12-19','2018-11-19','2018-11-19']
    }

df = pd.DataFrame(data=d)


     A      B       C

0   100     1   2018-11-19

1   200     2   2018-11-19

2   200     2   2018-12-19

3   400     4   2018-11-19

4   400     5   2018-11-19

набор данных

В приведенном выше примере, скажем, что

'm' = 2

'support' = 0.4

Тогда функция должна вернуть оба ['A', 'B] и [' A ',' C '], поскольку обе эти функции при рассмотрении вместе имеют как минимум 2 одинаковые строки из 5 строк (> = 0,4).

Я понимаю, что наивным решением было бы сравнить все комбинации «m»функции из 'M' и проверьте процент идентичных строк. Однако это будет невероятно сложным после величины features пересекает двойные цифры, особенно с тысячами строк. Что было бы оптимизированным кодом для решения этой проблемы?

1 Ответ

0 голосов
/ 20 октября 2019

Ну, я думаю, что мое решение немного трудоемко, но, поскольку другого ответа не было, я опубликую то, что я думал. Возможно, это решение послужит отправной точкой для более простого решения.

То, что я думал, это просто создание словаря, ключами которого будут функции, а значениями будут строки, в которых происходят повторения. Затем я использую этот словарь для расчета коэффициента повторения (переменная поддержки). Таким образом:

import pandas as pd
import re

d = {'A': [100, 200, 200, 400,400], 'B': [1,2,2,4,5], 
 'C':['2018-11-19','2018-11-19','2018-12-19','2018-11-19','2018-11-19']}

df = pd.DataFrame(data=d)

d = dict()
for k in ['A','B','C']:
    for i in range(len(df)):
        if df[k][i] in list(df[k][:i]):
            d.update({k+str(i): [(i-1,i)]})

s1 = pd.DataFrame(data = d).T.reset_index()
s1.columns = ['feature', 'rows']
s1['feature'] = [re.search('\w',i).group() for i in s1['feature']]

s2 = pd.DataFrame(s1['rows'].value_counts(normalize = True)).reset_index()

s2.columns = ['rows','support']

s3 = s1.set_index('rows').join(s2.set_index('rows')).reset_index()

s3 = s3[s3['support']>=.2]

df.loc[list(set([item for t in list(s3['rows']) for item in t])),:]

    A   B   C
1   200 2   2018-11-19
2   200 2   2018-12-19
3   400 4   2018-11-19
4   400 5   2018-11-19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...