[英]Pandas get all rows in dataframe A that contain substring of dataframe B
您可以执行以下操作:
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'
,因为它使用|
连接df2
的columnB
的值连接器。
然后str.contains
columnA
在df1
的 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
中使用any
和False
如果不是为了设置 boolean 屏蔽以过滤掉不需要的包含False
的行,即任何给定内的任何项目都没有匹配项df1['columnA']
行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.