我有一个带有“员工通用名称”和“显示名称”的 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()
您的问题是您仅将
.lower()
应用于显示名称,因此在“alice Cooper”中找不到“Alice”。尝试将您的代码更改为
df['Allowed'] = df.apply(lambda x: x['Employee Common Name'].lower() in x['DisplayName'].lower(), axis=1)
你做得很好,有一个小错误。您从未使用过 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
)
输出符合预期
您可以创建(检查“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
也许这些内容可以满足您的需求?
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
,反之亦然。