我对Pandas .isin()方法有一个奇怪的问题。我正在做一个项目,我需要通过长度,常用字/密码列表等识别错误的密码(不要担心,这是来自公共来源)。其中一种方法是查看是否有人将其名称的一部分用作密码。我正在使用.isin()来确定是否是这种情况,但它给了我奇怪的结果。显示:
# Extracting first and last names into their own columns
users['first_name'] = users.user_name.str.extract('(^.+)(\.)', expand = False)[0]
users['last_name'] = users.user_name.str.extract('\.(.+)', expand = False)
# Flagging the users with passwords that matches their names
users['uses_name'] = (users['password'].isin(users.first_name)) | (users['password'].isin(users.last_name))
# Looking at the new data
print(users[users['uses_name']][['password','user_name','first_name','last_name','uses_name']].head())
这个输出是:
password user_name first_name last_name uses_name
7 murphy noreen.hale noreen hale True
11 hubbard milford.hubbard milford hubbard True
22 woodard jenny.woodard jenny woodard True
30 reid rosanna.reid rosanna reid True
58 golden rosalinda.rodriquez rosalinda rodriquez True
大多数情况下都很好; milford.hubbard使用'hubbard'作为密码等。但是我们有几个例子,比如第一个。 Noreen Hale被标记,尽管她的密码是“墨菲”,只与她的名字共用一个字母。
我不能为我的生活找出造成这种情况的原因。有谁知道为什么会这样,以及如何解决它?
答案 0 :(得分:4)
由于您需要比较同一行中的相邻列,因此矢量化不是一个选项。因此,您可以使用(可能)最快的替代方案:列表理解:
df['uses_name'] = [
pwd in name for name, pwd in zip(df.user_name, df.password)
]
或者,如果您不喜欢循环,可以使用np.vectorize
隐藏它们:
def f(name, pwd):
return pwd in name
v = np.vectorize(f)
df['uses_name'] = v(df.user_name, df.password)
df
password user_name uses_name
7 murphy noreen.hale False
11 hubbard milford.hubbard True
22 woodard jenny.woodard True
30 reid rosanna.reid True
58 golden rosalinda.rodriquez False
考虑到您从first_name
中提取last_name
和user_name
,我认为您不需要它。
答案 1 :(得分:1)
关于发生此错误的原因:
如果您执行users['password'].isin(users.first_name)
,则要求每一行users['password']
,如果该元素包含在列first_name中的任何元素中
因此,我认为元素墨菲是在那个专栏中的某个地方