熊猫获取数据框A中包含数据框B的子字符串的所有行

时间:2020-07-28 21:23:36

标签: python pandas dataframe

所以我有2个数据帧,

数据框1: enter image description here

数据框2: enter image description here

我想获取dataframe1中包含dataframe 2中columnB子字符串的所有行

enter image description here

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

我应该如何实现?

2 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

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

那么您的输出DataFrame将是:

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

工作原理

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

然后,|函数在str.contains的{​​{1}}内搜索苹果或樱桃词(|等于或)。

答案 1 :(得分:0)

您可以使用以下方法进行列表理解:

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

首先,尽管使用df1['columnA'] = df1['columnA'].str.split(',')

,但必须确保逗号分隔的列表实际上是python列表。

完整代码:

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

输出:

    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的任何给定行中的任何项目都不匹配。