【问题标题】:Odd issue with .isin() and strings (Python/Pandas).isin() 和字符串(Python/Pandas)的奇怪问题
【发布时间】:2018-08-13 17:28:39
【问题描述】:

我在使用 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 被标记,尽管她的密码是“murphy”,与她的名字只有一个字母。

我这辈子都想不通是什么原因造成的。有谁知道为什么会发生这种情况,以及如何解决它?

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    由于您需要比较同一行中的相邻列,因此矢量化在这里并不是一个很好的选择。因此,您可以使用(可能)最快的替代方法:列表理解:

    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
    

    考虑到您从user_name 中提取first_namelast_name,我认为您在这里不需要它。

    【讨论】:

      【解决方案2】:

      关于出现此错误的原因:

      如果您执行users['password'].isin(users.first_name),则您会询问users['password'] 的每一行,如果该元素包含在 first_name 列中的任何元素中 因此,我假设元素 murphy 位于该列中的某个位置

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2011-06-03
        • 1970-01-01
        相关资源
        最近更新 更多