dataframe python检查字符串是否存在于另一列中,忽略大写/小写
我的数据帧与我在中要求的相同 我想检查名称是否也是描述的一部分,如果是,则保留该行。如果不是,请删除该行。在这种情况下,它将在某处删除第三行JW员工 我正在使用dataframe python检查字符串是否存在于另一列中,忽略大写/小写,python,pandas,dataframe,Python,Pandas,Dataframe,我的数据帧与我在中要求的相同 我想检查名称是否也是描述的一部分,如果是,则保留该行。如果不是,请删除该行。在这种情况下,它将在某处删除第三行JW员工 我正在使用 df[df.apply(lambda x: x['Name'] in x['Description'], axis = 1)] 在这种情况下,它还删除了BQ的行,因为在描述中BQ是小写的。在这里,是否仍要使用相同的语法,但要考虑大小写敏感度?使用.lower使其不区分大小写: df[df.apply(lambda x: x['Name
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与艾米的匹配。您可能希望使用单词边界来防止这种情况:
>>> 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
或拆分,更好地处理正则表达式特殊字符:
df[df.apply(lambda x: x["Name"].lower() in x["Description"].lower().split(), axis=1)]
使用.lower使其不区分大小写:
df[df.apply(lambda x: x['Name'].lower() in x['Description'].lower(), axis=1)]
请注意,这将考虑AM与艾米的匹配。您可能希望使用单词边界来防止这种情况:
>>> 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
或拆分,更好地处理正则表达式特殊字符:
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)]
你应该使用
df[df.apply(lambda x: x['Name'] in x['Description'].split(' '), axis = 1)]
您可以使用lower、split和isin:
输出:
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的值
最后在轴1行中做任意一个,以查看是否至少有一个单词匹配:
print(df.Description.str.lower().str.split(expand=True).isin(df.Name.str.lower()).any(1))
0 True
1 True
2 False
dtype: bool
您可以使用lower、split和isin:
输出:
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的值
最后在轴1行中做任意一个,以查看是否至少有一个单词匹配:
print(df.Description.str.lower().str.split(expand=True).isin(df.Name.str.lower()).any(1))
0 True
1 True
2 False
dtype: bool
是的。下限也应该与。拆分一起添加。这里是df[df.applylambda x:x['Name'].x['Description']中的lower.split'',axis=1]。谢谢@ggorlensplit默认情况下按空格拆分,.split就足够了。是的。lower也应该与.split一起添加。这里是df[df.applylambda x:x['Name'].x['Description']中的lower.split'',axis=1]。谢谢@ggorlensplit默认情况下按空格拆分,.split就足够了。第一种解决方案的问题是Am是Am的所有者,也是Amy的所有者,在第二种情况下,它不会给出所需的输出,IIUC.OP实际上没有指定子字符串有问题,这只是我的猜测/建议。只有当字符串中有正则表达式特殊字符时,第二个才会失败。您可以使用split,这可能更好。不过,出于好奇,它怎么会失败呢?没错,你是对的,OP没有指明问题所在。但是如果是这样的话,我的意思是,如果是关于子串,第一个就不起作用了。不,第二个是很棒的,它不会在猜测的子串问题中失败:!第一种解决方案的问题是,Am是Am的所有者,也是Amy的所有者,在第二种情况下,它不会给出所需的输出,IIUC.OP并没有真正指定子字符串存在问题,这只是我的猜测/建议。只有当字符串中有正则表达式特殊字符时,第二个才会失败。您可以使用split,这可能更好。不过,出于好奇,它怎么会失败呢?没错,你是对的,OP没有指明问题所在。但是如果是这样的话,我的意思是,如果是关于子串,第一个就不起作用了。不,第二个是很棒的,它不会在猜测的子串问题中失败:!谢谢@ggorlen,是的,刚刚编辑了答案,您可以在没有tolist的情况下比较该列。谢谢@ggorlen,是的,刚刚编辑了答案,您可以在没有tolist的情况下比较该列。