python - Pandas 根据另一列提取子字符串
问题描述
我有 2 个数据框。下面是第一个df:
df1={"columnA":['apple,cherry','pineple,lemon','banana, pear','cherry, pear, lemon']}
df1=pd.DataFrame(df1)
第二个df:
df2={"columnB":['lemon','cherry']}
df2=pd.DataFrame(df2)
我已经得到了 df1 中出现在 df2 中的所有值。我正在使用以下代码进行过滤:
words = [rf'\b{string}\b' for string in df2.columnB]
df1[df1['columnA'].str.contains('|'.join(words))]
我得到了以下信息:
所以下一步我想做的是从上面的结果中删除所有不需要的子字符串,如下所示:
请让我知道我怎样才能做到这一点?
解决方案
我认为您需要将一个单独的方法应用于 DataFrame:
def keep_words(cell, df):
words = cell.split(',')
result = []
for word in words:
if word.strip() in list(df.columnB):
result.append(word)
return ','.join(result)
words = [rf'\b{string}\b' for string in df2.columnB]
df1 = df1[df1['columnA'].str.contains('|'.join(words))]
df3 = df1.columnA.apply(lambda x: keep_words(x, df2))
由于需要安静的几个步骤才能完成,因此定义一个单独的方法(keep_words),该方法接收每个单元格内的字符串,以及带有接受单词的 DataFrame,将字符串中的每个单词与接受单词的“列表”进行比较并返回符合条件的。
不过,我不确定更大 DataFrame 的性能。
推荐阅读
- php - 如果 strpos() 函数的“needle”参数包含一个不能用作任何字符的序数值的转换整数值怎么办?
- javascript - 是否有确保嵌套 JavaScript 对象用 && 分隔的 lint 规则?
- bash - 在脚本中运行时使用 !(lo) 语法的语法错误
- sql - 使用可选字段优化 INNER JOIN
- javascript - PHP JSON 标头导致 JSON.parse 错误(使用 jQuery)
- electron - 如何与托盘菜单上的电子单选按钮交互?
- r - 合并两个没有键的表
- vba - if then ... else 语句中的重复代码
- mysql - MySQL 5.7.5+ 获得组的第一行
- ios - AutoLayout 约束动画从错误的点缩放