如果 A 的子字符串位于一个 DF 的 B 字符串中,则不选择行

问题描述 投票:0回答:4

我有一个带有“员工通用名称”和“显示名称”的 df,如果“员工通用名称”位于“显示名称”内,我不想选择该行。

我还没有找到一种方法来做到这一点,但我当前(失败)的解决方法是如果“员工通用名称”位于“显示名称”内,则创建一个布尔列。

然而一切都是假的。

工作示例:


import pandas as pd
df = pd.DataFrame({'Employee Common Name': ['Bob', 'Makenzie', 'Alice'], 
                   'DisplayName': ['Robert Inger', 'Kenzie Doe', 'Alice Cooper']})

df['Allowed']=df.apply(lambda x: str(df['Employee Common Name']) in str(df['DisplayName']).lower(), axis=1)

预期输出:

员工通用名 显示名称 允许
鲍勃 罗伯特·英格 错误
麦肯兹 肯齐·多伊 错误
爱丽丝 爱丽丝·库珀 正确

我已经在“员工通用名称”上使用了 str.strip()

python pandas
4个回答
0
投票

您的问题是您仅将

.lower()
应用于显示名称,因此在“alice Cooper”中找不到“Alice”。尝试将您的代码更改为

df['Allowed'] = df.apply(lambda x: x['Employee Common Name'].lower() in x['DisplayName'].lower(), axis=1)

0
投票

你做得很好,有一个小错误。您从未使用过 x (您的 lambda 函数的参数)。使用 x 访问当前行而不是 df (访问整个系列)。

import pandas as pd
df = pd.DataFrame({'Employee Common Name': ['Bob', 'Makenzie', 'Alice'], 
                   'DisplayName': ['Robert Inger', 'Kenzie Doe', 'Alice Cooper']})


df['Allowed'] = df.apply(
    lambda x: x['Employee Common Name'].lower() in x['DisplayName'].lower(), axis=1
)

输出符合预期


0
投票

您可以创建(检查“Employee Common Name”是否在“DisplayName”内)并将列表分配给新列:

df["Allowed"] = [e in d for e, d in zip(df["Employee Common Name"], df["DisplayName"])]

print(df)

打印:

  Employee Common Name   DisplayName  Allowed
0                  Bob  Robert Inger    False
1             Makenzie    Kenzie Doe    False
2                Alice  Alice Cooper     True

0
投票

也许这些内容可以满足您的需求?

import pandas as pd
df = pd.DataFrame({'Employee Common Name': ['Bob', 'Makenzie', 'Alice'], 
                   'DisplayName': ['Robert Inger', 'Kenzie Doe', 'Alice Cooper']})

df[~df['DisplayName'].str.contains("|".join(df['Employee Common Name']))]

如果字符串包含

DisplayName
中的任何子字符串,则我们在
Employee Common Name
中查找子字符串匹配,并且
|
表示“OR”。最后,波形符 (
~
) 将
True
交换为
False
,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.