Как определить повторение строк во всех строках столбца в Pandas DataFrame? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь придумать, как лучше с этим справиться.Если у меня есть фрейм данных, подобный этому:

Module---|-Line Item---|---Formula-----------------------------------------|-repetition?|--What repeated--------------------------------|---Where repeated
Module 1-|Line Item 1--|---hello[SUM: hello2]------------------------------|----yes-----|--hello[SUM: hello2]---------------------------|---Module 1 Line item 2
Module 1-|Line Item 2--|---goodbye[LOOKUP: blue123] + hello[SUM: hello2]---|----yes-----|--hello[SUM: hello2], goodbye[LOOKUP: blue123]-|---Module 1 Line item 1, Module 2 Line Item 1
Module 2-|Line Item 1--|---goodbye[LOOKUP: blue123] + some other line item-|----yes-----|--goodbye[LOOKUP: blue123]---------------------|---Module 1 Line item 2

Как мне настроить поиск и найти и найти и идентифицировать повторения в середине или на краях или в полных строках?

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

Я хочу сопоставить любое повторение, которое встречается между 3 и более словами, в том числе, если, например, формула была 1 + 2 + 3 + 4, и это произошло 4 раза в столбце ФормулаЯ хотел бы дать да булевому столбцу «повторение», возвращающему 1 + 2 + 3 + 4 в столбце «Где повторяется» и список каждой комбинации модуля / позиции, где это произошло в последнем столбце.Я уверен, что смогу настроить его под свои нужды, как только начну.

1 Ответ

0 голосов
/ 04 декабря 2018

Это было немного грязно, это, безусловно, более простой способ сделать некоторые из шагов, но это сработало для ваших данных.

Шаг 1: Я просто reset_index () (при условии, что индекс использует строкучисла), чтобы получить номера строк в столбце.

df.reset_index(inplace=True)

Затем я написал цикл for, целью которого было проверить каждое заданное значение, находится ли это значение в любом месте взаданный столбец (используя функцию .str.contains(), и, если да, где. А затем сохраните эту информацию в словаре. Обратите внимание, что здесь я использовал +, чтобы разделить различные значения, по которым вы выполняете поиск, так как это выглядит как действительный разделитель вваш набор данных, но вы можете настроить это соответственно

#the dictionary will have a key containing row number and the value we searched for
#the value will contain the module and line item values
result = {}
#create a rownumber variable so we know where in the dataset we are
rownumber = -1
#now we just iterate over every row of the Formula series
for row in df['Formula']:
    rownumber +=1
    #and also every relevant value within that cell
    for value in row.split('+'):
        #we clean the value from trailing/preceding whitespace
        value = value.strip()
        #and then we return our key and value and update our dictionary
        key = 'row:|:'+str(rownumber)+':|:'+value
        value = (df.loc[((df.Formula.str.contains(value,regex=False))) & (df.index!=rownumber),['Module','Line Item']])
        result.update({key:value})

Теперь мы можем распаковать словарь в список, где у нас было совпадение:

where_raw = []
what_raw = []
rows_raw = []
for key,value in zip(result.keys(),result.values()):
    if 'Empty' in str(value):
        continue
    else:
        where_raw.append(list(value['Module']+' '+value['Line Item']))
        what_raw.append(key.split(':|:')[2])
        rows_raw.append(int(key.split(':|:')[1]))

tempdf = pd.DataFrame({'row':rows_raw,'where':where_raw,'what':what_raw})

tempdf теперь содержит одну строку вmatch, однако, мы хотим иметь одну строку на исходную строку в df, поэтому мы объединяем все совпадения для каждой основной строки в один

where = []
what = []
rows = []        

for row in tempdf.row.unique():
    where.append(list(tempdf.loc[tempdf.row==row,'where']))
    what.append(list(tempdf.loc[tempdf.row==row,'what']))
    rows.append(row)
result = df.merge(pd.DataFrame({'index':rows,'where':where,'what':what}))

, наконец, теперь мы можем получить результат путем слияния результата с нашимисходная датафрая

result = df.merge(pd.DataFrame({'index':rows,'where':where,'what':what}),how='left',on='index').drop('index',axis=1)

и, наконец, мы можем добавить столбец repeated следующим образом: result['repeated'] = (result['what']!='')

 print(result)
 Module     Line Item   Formula                                         what                                                 where
 Module 1   Line Item 1 hello[SUM: hello2]                              ['hello[SUM: hello2]']                               [['Module 1 Line Item 2']]
 Module 1   Line Item 2 goodbye[LOOKUP: blue123] + hello[SUM: hello2]   ['goodbye[LOOKUP: blue123]', 'hello[SUM: hello2]']   [['Module 2 Line Item 1'], ['Module 1 Line Item 1']]
 Module 2   Line Item 1 goodbye[LOOKUP: blue123] + some other line item ['goodbye[LOOKUP: blue123]']                         [['Module 1 Line Item 2']]
...