Python 定义用另一个数据帧过滤数据帧的函数

Python 定义用另一个数据帧过滤数据帧的函数,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧:bmg和etext bmg = pd.DataFrame({''product_title':['%macroeconomics 101','Physics','Calculus'], 'author':['Abel', 'Jenkins', 'Williams'], 'isbn13':['1238404589228', '1238404589235', '123840458432']}) bmg etext

我有两个数据帧:bmg和etext

bmg = pd.DataFrame({''product_title':['%macroeconomics 101','Physics','Calculus'], 
                'author':['Abel', 'Jenkins', 'Williams'], 
                'isbn13':['1238404589228', '1238404589235', '123840458432']})
bmg


etext = pd.DataFrame({'Title':['Macroeconomics','History','Anatomy'], 
                'Author':['Abel', 'Jenkins', 'Franklin']})

etext

我想过滤bmg集,使其仅在etext数据框中包含匹配的值(即,与etext数据框中列出的作者和标题相同)。这是一个挑战:bmg集合中的“产品名称”有时会有额外的字符,因此它不会是直接匹配。我希望它是一个str.contains

如果我这样做:

find = 'Macroeconomics'
test = df[df['product_title'].str.contains(find, case=False, na=False)]
test
过滤器可以工作,但我当然会过滤掉etext中我想要的其他行。我需要在整个etext数据帧的两列上运行

bmg的预期产量:

pd.DataFrame({''product_title':['%macroeconomics 101], 
                'author':['Abel'], 
                'isbn13':['1238404589228']})

谢谢大家!

您可以尝试合并数据帧并删除与规则不匹配的行:

df = pd.merge(etext, bmg, left_on='Author', right_on='author')

df = df[df.apply(lambda x: x['Title'] in x['product_title'], axis=1)]
然后,如果标题不同,可以将其转换为索引

df = df.set_index('Title')
df.loc['Macroeconomics']

你介意发布一个最小的(但有意义的)工作示例吗?输入和预期输出。嗨,里卡多-谢谢你的回复。我添加了数据帧的屏幕截图。我期望的输出只是一个过滤后的bmg数据帧,其中包含etext列的所有str.contains。因此,例如,我希望它能够过滤所有以“Abel”为作者,以“product_title”为“Macroeconomics”的行。即使“产品标题”上写着:“%Macroeconomics 101”,请发布我们创建这些数据帧所需的代码。另外,期望的输出是什么?这是最重要的部分。尝试构建两个输入数据帧并输出一个,然后将它们发布到这里,这样我们就可以再次验证我们的解决方案。我做了一些编辑,希望对您有所帮助。非常感谢你!谢谢你的回复。问题是作者的名字和书名并不总是直接匹配的。如果etext有“微观经济学”,而bmg有“%Microeconomics”,那么上面的方法就行不通了。你说过只有标题不同。如果etext有“微观经济学”,而bmg有“%微观经济学”,那么上述方法正好适用于您刚才指出的情况