Это было немного грязно, это, безусловно, более простой способ сделать некоторые из шагов, но это сработало для ваших данных.
Шаг 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']]