[英]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.