.isin()和字符串(Python / Pandas)的奇怪问题

问题描述 投票:5回答:2

我对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被标记,尽管她的密码是“墨菲”,她的名字只有一封信。

我不能为我的生活找出导致这种情况的原因。有谁知道为什么会这样,以及如何解决它?

python regex pandas
2个回答
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_nameuser_name,我认为你不需要它。


1
投票

关于出现此错误的原因:

如果你做users['password'].isin(users.first_name)你要求users['password']的每一行,如果该元素包含在列first_name中的任何元素中那么我假设元素murphy在该列的某处

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