Как динамически сопоставлять строки из двух панелей данных - PullRequest
1 голос
/ 27 мая 2019

У меня есть большой массив данных URL-адресов и меньший 2-й кадр данных, который содержит столбцы строк, которые я хочу использовать для объединения двух данных.Данные от 2-го разряда будут использоваться для заполнения большего 1-го разряда.

Соответствующие строки могут содержать * подстановочные знаки (и более одного), но порядок группировки по-прежнему имеет значение;поэтому «путь / * путь2» будет соответствовать «exsample.com/eg_path/extrapath2.html, но не exsample.com/eg_path2/path/test.html. Как я могу использовать строки во 2-м кадре данных, чтобы объединить два кадра данных вместе?. Во втором кадре данных может быть более одной подходящей строки.

import pandas as pd

urls = {'url':['https://stackoverflow.com/questions/56318782/','https://www.google.com/','https://en.wikipedia.org/wiki/Python_(programming_language)','https://stackoverflow.com/questions/'],
        'hits':[1000,500,300,7]}
metadata = {'group':['group1','group2'],
            'matching_string_1':['google','wikipedia*Python_'],
            'matching_string_2':['stackoverflow*questions*56318782','']}
result = {'url':['https://stackoverflow.com/questions/56318782/','https://www.google.com/','https://en.wikipedia.org/wiki/Python_(programming_language)','https://stackoverflow.com/questions/'],
        'hits':[1000,500,300,7],
        'group':['group2','group1','group1','']}

df1 = pd.DataFrame(urls)
df2 = pd.DataFrame(metadata)

what_I_am_after = pd.DataFrame(result)

1 Ответ

1 голос
/ 27 мая 2019

Не очень надежный, но дает правильный ответ для моего примера.

import pandas as pd

urls = {'url':['/9268878/kak-dinamicheski-sopostavlyat-stroki-iz-dvuh-panelei-dannyh','https://www.google.com/','https://en.wikipedia.org/wiki/Python_(programming_language)','https://stackoverflow.com/questions/'],
        'hits':[1000,500,300,7]}
metadata = {'group':['group1','group2'],
            'matching_string_1':['google','wikipedia*Python_'],
            'matching_string_2':['stackoverflow*questions*56318782','']}
result = {'url':['/9268878/kak-dinamicheski-sopostavlyat-stroki-iz-dvuh-panelei-dannyh','https://www.google.com/','https://en.wikipedia.org/wiki/Python_(programming_language)','https://stackoverflow.com/questions/'],
        'hits':[1000,500,300,7],
        'group':['group2','group1','group1','']}

df1 = pd.DataFrame(urls)
df2 = pd.DataFrame(metadata)
results = pd.DataFrame(columns=['url','hits','group'])

for index,row in df2.iterrows():
    for x in row[1:]:
        group = x.split('*')
        rx = "".join([str(x)+".*"  if len(x) > 0 else '' for x in group])
        if rx == "":
            continue
        filter = df1['url'].str.contains(rx,na=False, regex=True)
        if filter.any():
            temp = df1[filter]
            temp['group'] = row[0]
            results = results.append(temp)

d3 = df1.merge(results,how='outer',on=['url','hits'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...