所以我有2个数据帧,
我想获取dataframe1中包含dataframe 2中columnB子字符串的所有行
我正在使用df1['columnA'].isin(df2['columnB'])
,但我无法正常工作。
我应该如何实现?
答案 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(',')
完整代码:
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
的任何给定行中的任何项目都不匹配。