python - 检查熊猫数据框的一列是否包含不同列的每一行的子字符串?
问题描述
很长一段时间以来,我一直坚持我最初认为是一项简单的任务。在这里,我将使用示例数据,因为实际的问题数据要混乱得多(而且保密)。基本上我有两列都包含字符串。我想检查列“子字符串”的每一行,如果它是“字符串”列的任何行的子字符串:
s1 = ['good', 'how', 'hello', 'start']
s2 = ['exit', 'hello you','where are you', 'goodbye']
test = pd.DataFrame({'substring':s1, 'string':s2})
>>> test
string substring
0 exit good
1 hello you how
2 where are you hello
3 goodbye start
本质上,如果列 A 是列 B 中任何位置的子字符串,我希望每一行都有一些指示符:
>>>test
string substring C
0 exit good True
1 hello you how False
2 where are you hello True
3 goodbye start False
我似乎尝试了很多事情,但我只是迷路了。
我试过迭代行:
sub_test = pd.DataFrame(columns=test.columns)
for index, row in test.iterrows():
a = row['substring']
delta = test[test['string'].str.contains(a)]
if len(delta.index > 1):
sub_test = pd.concat([sub_test, delta])
这让我得到了一些方法并返回:
>>>sub_test
string substring
3 goodbye start
1 hello you how
我认为有一种使用 lambda 的方法,但我没有成功:
test['C'] = test.apply(lambda row: row['substring'] in policies['substring'], axis = 1)
任何帮助,将不胜感激。谢谢
解决方案
形成一个我们用来提取所有子字符串的大模式。然后我们使用isin
检查来查看是否在substring
任何地方匹配。
p = '('+'|'.join(test.substring)+')'
test['C'] = test['substring'].isin(test['string'].str.extractall(p)[0].unique())
substring string C
0 good exit True
1 how hello good you False
2 hello where are you True
3 start goodbye False
这通过str.extractall
返回带有匹配项的 DataFrame 来工作。
test['string'].str.extractall(p)
0
match
1 0 hello
3 0 good
索引与 的索引有关test
,这里不重要,还有一个级别表示匹配数(因为我们使用.extractall
)。该值是匹配的子字符串。由于我们的捕获组包含特定的单词(不是一般模式),我们可以使用相等检查 ( isin
) 来获取'substring'
值的掩码。
推荐阅读
- javascript - JavaScript节点中的承诺值未更新变量值
- garbage-collection - 强制对 WeakReference 的目标进行垃圾回收
- angular - 单击时的 Angular Material 选项卡波纹效果不适用于拉伸后的完整选项卡
- flutter - 无法使用颤振和 Firebase 注销但我可以登录
- sql - 将 Hibernates @SqlDelete 与 JPA 的 @PreRemove 挂钩结合使用
- angularjs - 在条目中使用 Webpack 插件输出。AngularTemplateCacheWebpackPlugin
- c - 设置目标节标题后 elf_update() 中的问题
- pytorch - Pytorch DataLoader 返回可迭代,如何以及何时转换为张量以进行模型训练
- c++ - OpenCV DNN 不使用 Deeplabv3.onnx 模型产生预期结果
- kubernetes - 某些 Prometheus 警报最终显示为“未分组”