繁体   English   中英

Pandas 获取 dataframe A 中包含 dataframe B 的 substring 的所有行

[英]Pandas get all rows in dataframe A that contain substring of dataframe B

所以我有 2 个数据框,

dataframe 1: 在此处输入图像描述

dataframe 2: 在此处输入图像描述

我想获取 dataframe1 中包含 dataframe 2 中 columnB 的 substring 的所有行:

在此处输入图像描述

我正在使用df1['columnA'].isin(df2['columnB'])但我无法正常工作。

我应该如何实现这一目标?

您可以执行以下操作:

import pandas as pd
df1 = pd.DataFrame({"columnA":["apple, orange","pear, apple, lemon","banana, pear","cherry, pear, lemon"]})
df2 = pd.DataFrame({"columnB":["apple","cherry"]})

out = df1[df1.columnA.str.contains('|'.join(df2.columnB.values))]

那么你的 output DataFrame将是:

>>> out
               columnA
0        apple, orange
1   pear, apple, lemon
3  cherry, pear, lemon

怎么运行的

'|'.join(df2.columnB.values)将导致'apple|cherry' ,因为它使用|连接df2columnB的值连接器。

然后str.contains columnAdf1的 columnA 中搜索苹果或樱桃词( |用作或)。

您可以通过以下方式进行列表理解:

df1[df1['columnA'].apply(lambda x: any([y for y in x for z in df2['columnB'] if y in z]))]

首先,您必须确保您的逗号分隔列表实际上是一个 python 列表,尽管df1['columnA'] = df1['columnA'].str.split(',')

完整代码:

import pandas as pd
df1= pd.DataFrame({'columnA' : ['apple,orange', 'pear,apple,lemon','banana,pear','cherry,pear,lemon']})
df1['columnA'] = df1['columnA'].str.split(',')
df2 = pd.DataFrame({'columnB' : ['apple','cherry']})
df1 = df1[df1['columnA'].apply(lambda x: any([y for y in x for z in df2['columnB'] if y in z]))]
df1

output:

    columnA
0   [apple, orange]
1   [pear, apple, lemon]
3   [cherry, pear, lemon]

列表理解通过检查每行列表中any每个df1['columnA']值是否在df2['columnB']中来工作。 y代表df1['columnA']的每一行列表中的各个项目, x代表df1['columnA']每一行。 最后, z代表df2['columnB']每一行。 因此,最终,您需要返回True如果任何y列表项在z中使用anyFalse如果不是为了设置 boolean 屏蔽以过滤掉不需要的包含False的行,即任何给定内的任何项目都没有匹配项df1['columnA']行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM