[英]pandas dataframe-python check if string exists in another column ignoring upper/lower case
我有相同的 dataframe ( pandas dataframe 检查列是否包含另一列中存在的字符串)
Name Description
Am Owner of Am
BQ Employee at bq
JW Employee somewhere
我想检查名称是否也是描述的一部分,如果是,请保留该行。 如果不是,请删除该行。 在这种情况下,它将删除第 3 行(某处的 JW Employee)
我在用
df[df.apply(lambda x: x['Name'] in x['Description'], axis = 1)]
在这种情况下,它也删除了 BQ 行,因为在描述中“bq”是小写的。 无论如何要使用相同的语法但考虑到区分大小写?
使用.lower()
使其与大小写无关:
df[df.apply(lambda x: x['Name'].lower() in x['Description'].lower(), axis=1)]
请注意,这会将"am"
视为"amy"
的匹配项。 您可能希望使用单词边界来防止这种情况:
>>> def filter(x):
... return bool(re.search(rf"(?i)\b{x['Name']}\b", x["Description"]))
...
>>> df[df.apply(filter, axis=1)]
Name Description
0 Am Owner of Am
1 BQ Employee at bq
或split
更好地处理正则表达式特殊字符:
df[df.apply(lambda x: x["Name"].lower() in x["Description"].lower().split(), axis=1)]
你应该使用
df[df.apply(lambda x: x['Name'] in x['Description'].split(' '), axis = 1)]
您可以使用lower
、 split
和isin
:
msk=df.Description.str.lower().str.split(expand=True).isin(df.Name.str.lower()).any(1)
df[msk]
Output:
Name Description
0 Am Owner of Am
1 BQ Employee at bq
细节
首先我们使用str.lower
将字符串转换为小写
print(df.Description.str.lower())
0 owner of am
1 employee at bq
2 employee somewhere
Name: Description, dtype: object
然后我们拆分字符串并展开列表:
print(df.Description.str.lower().str.split(expand=True))
0 1 2
0 owner of am
1 employee at bq
2 employee somewhere None
然后我们用isin
检查df.name
的值
print(df.Description.str.lower().str.split(expand=True).isin(df.Name.str.lower()))
0 1 2
0 False False True
1 False False True
2 False False False
最后在轴 1 中进行any
操作(按行),以查看是否至少有一个单词匹配:
print(df.Description.str.lower().str.split(expand=True).isin(df.Name.str.lower()).any(1))
0 True
1 True
2 False
dtype: bool
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.