如何动态匹配两个数据帧中的行

2024-09-22 14:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的url数据框和一个较小的第二个包含字符串列的数据框,我想用它们将两个数据框合并在一起。来自第二个数据框的数据将用于填充较大的第一个数据框。你知道吗

匹配的字符串可以包含*通配符(不止一个),但分组的顺序仍然很重要;因此“path/*path2”将与exsample.com/eg\u路径/extrapath2.html但不是exsample.com/eg\u路径2/path/test.html。如何使用第二个数据帧中的字符串将两个数据帧合并在一起。在第二个数据帧中可以有多个匹配的字符串。你知道吗

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)

Tags: 数据path字符串httpscomurldataframegoogle
1条回答
网友
1楼 · 发布于 2024-09-22 14:37:07

不是很可靠,但为我的例子给出了正确的答案。你知道吗

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)
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'])

相关问题 更多 >