我有一列包含一个字符串,该字符串有时具有一个名称,两个名称或多个用分号分隔的名称。我想确定某行是否与所有指定的名称匹配,但是如果某行仅包含某些指定的名称,则不可以。
SME
第1行-约翰;拉尔夫;苏珊;乔
第2行-拉尔夫
第3行-苏珊;拉尔夫;罗伯特;玛格丽特
第4行-Ralph; Susan
df1['SME'] = df1.SMES.str.ONLY contains('Ralph', na=False, case=True)
df2['SME'] = df1.SMES.str.ONLY contains('Ralph;Susan', na=False, case=True)
期待df1
第1行-错误
第2行-正确
第3行-错误
第4行-错误
期待df2
第1行-错误
第2行-错误
第3行-错误
第4行-正确
答案 0 :(得分:0)
要检查确切的值,您可以像这样在df中放置一个条件:
xp_cmdshell
如果只想使用true / false值,则可以使用以下条件创建掩码:
df1[df1['SME'] == 'Ralph']
答案 1 :(得分:0)
做一些lambda函数:
f1 = lambda x: True if 'Ralph' in x else False
因此,您将.apply新建一列。
df['has_Ralph'] = df['SME'].apply(f1)
因此yu可以选择以下列:
df_Ralph = df[df['SME'] == True]
答案 2 :(得分:0)
我找到了一个在线python编辑器:https://www.onlinegdb.com/online_python_compiler
Row1 = "John;Ralph;Susan;Joe"
Row2 = "Ralph"
Row3 = "Susan;Ralph;Robert;Margaret"
Row4 = "Ralph;Susan"
Find1 = "Ralph"
Find2 = "Ralph;Susan"
Find3 = "Susan;Ralph"
def ContainsAllOf(Row,Find):
Result = 'False'
Rows = Row.split(';')
Finds = Find.split(';')
if len(Rows) == len(Finds):
difference = [r for r in Rows if r not in Finds]
if len(difference) == 0:
Result = 'True'
print(Row + '\n' + Find + '\n' + Result + '\n')
ContainsAllOf(Row1,Find1)
ContainsAllOf(Row2,Find1)
ContainsAllOf(Row3,Find1)
ContainsAllOf(Row4,Find1)
ContainsAllOf(Row1,Find2)
ContainsAllOf(Row2,Find2)
ContainsAllOf(Row3,Find2)
ContainsAllOf(Row4,Find2)
ContainsAllOf(Row1,Find3)
ContainsAllOf(Row2,Find3)
ContainsAllOf(Row3,Find3)
ContainsAllOf(Row4,Find3)
以下是输出:
John;Ralph;Susan;Joe
Ralph
False
Ralph
Ralph
True
Susan;Ralph;Robert;Margaret
Ralph
False
Ralph;Susan
Ralph
False
John;Ralph;Susan;Joe
Ralph;Susan
False
Ralph
Ralph;Susan
False
Susan;Ralph;Robert;Margaret
Ralph;Susan
False
Ralph;Susan
Ralph;Susan
True
John;Ralph;Susan;Joe
Susan;Ralph
False
Ralph
Susan;Ralph
False
Susan;Ralph;Robert;Margaret
Susan;Ralph
False
Ralph;Susan
Susan;Ralph
True