сравнить длинный список со строками в фрейме данных и на основе сопоставления заполнить фрейм данных в Python - PullRequest
0 голосов
/ 27 апреля 2020

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

https://www.aminer.org/oag2019

list1 = [«типы документов», «обзоры и обзоры», «справочные материалы», «материалы Генеральной конференции», «биографии», «общая литература», «вычислительные стандарты, инструкции и руководства», «кросс-вычислительные инструменты и методы», ......]

общее количество list1 - 2112 терминов по информатике от ACM.

фрейм данных, с которым нужно сравнить (сравнение строк) list1 в столбце фрейма данных в виде

df_train14year ['ключевые слова']. Head ()

0 "ЯМР-спектроскопия", "масс-спектрометрия", "наност ... 1" плк1 "," катионит c диалкилгистидин "," кристалл с ... 2 "случай-контроль", "ребенок", "топливо" "," углеводороды "," ... 3 "обработка Ca2 +", "CaMKII", "кардиомиоцит", "продолжение ... 4
Название: ключевые слова, dtype: object

в каждом из этих в списках данных имеется максимум 10 ключевых слов min (3) в каждом и миллионы записей в кадре данных.

, поэтому я должен сравнить каждое ключевое слово с исходным списком1, если в обоих списках совпадают более 3 слов, и заполнить фрейм данных этими значениями, может потребоваться сопоставление подстрок.

как сделать эту задачу неэффективным способом в python, что я сделал для l oop для каждого ключевого слова по сравнению со всем списком, и в нем три цикла, так что это неэффективно .

# for i in range(5):
#    df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']

count  = 0;
i = 0;
for index, row in df_train14year.iterrows():
  # print("index",index)
  i=1+1;
  # if(i==50):
  #   break
  for outr in row['keywords'].split(","):
      #print(count)   
      if (count>1):
          # print("found1")
          count = 0;
          break;
      for inr in computerList:
          # outr= outr.replace("[","")   # i skip the below three lines because i applied the pre- processing on data to remove the [] and "
          # outr= outr.replace("]","")
          outr= outr.replace('"',"")
          #print("outr",outr,"inr",inr)
          if outr in inr:
              count = count+1
              if (count>10):
                #print("outr",outr,"inr",inr)
                # print("found2")
                # df12.loc[i] = [index,row['keywords']]
                #df12.insert(index,"keywords",row['keywords'])
                df14_4_match = df14_4_match.append({'abstract': row['abstract'],'keywords': row['keywords'],'title': row['title'],'year': row['year']}, ignore_index=True)
                break;
          # else:
          #     print('not found')```

1 Ответ

0 голосов
/ 03 мая 2020

kewwords = ["nmr спектроскопия", "масс-спектрометрия", "nanos"] строки во фрейме данных

prprocessing: dfk['list_keywords']=[[x for x in j.split('[')[1].split(']')[0].split('"')[1:-1] if x not in[',',' , ',', ']] for j in dfk['keywords']]

после преобразования списка orgional в set

dfk['set_keywords']=dfk['list_keywords'].map(lambda x: set(x))

мы сравниваем пересечение kewordlist и computerlist (list1), упомянутых в вопросе, чтобы получить количество подходящих элементов или ключевых слов

dfk['set_keywords']=dfk['set_keywords'].map(lambda x:x.intersection(proceseedComputerList))

получить длину с помощью этой функции

dfk['len_keywords']=dfk['set_keywords'].map(lambda x:len(x))

сортировка по возрастанию

dfk.head()```

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...