【问题标题】:Numpy select returning boolean error messageNumpy 选择返回布尔错误消息
【发布时间】:2019-08-01 20:10:25
【问题描述】:

我想在路径中查找匹配的字符串并使用 np.select 创建一个新列,其标签取决于我找到的匹配项。

这是我写的

import numpy as np
conditions  = [a["properties_path"].str.contains('blog'),
               a["properties_path"].str.contains('credit-card-readers/|machines|poss|team|transaction_fees'),
               a["properties_path"].str.contains('signup|sign-up|create-account|continue|checkout'),
               a["properties_path"].str.contains('complete'),
               a["properties_path"] == '/za/|/',
              a["properties_path"].str.contains('promo')]
choices     = [ "blog","info_pages","signup","completed","home_page","promo"]
a["page_type"] = np.select(conditions, choices, default=np.nan)

但是,当我运行此代码时,我收到以下错误消息:

ValueError: condlist 中的无效条目 0: 应该是布尔 ndarray

这是我的数据示例

3124465                                       /blog/ts-st...
3124466                                       /card-machines
3124467                                       /card-machines
3124468                                       /card-machines
3124469                               /promo/our-gift-to-you
3124470                                   /create-account/v1
3124471                                          /za/signup/
3124472                                   /create-account/v1
3124473                                             /sign-up
3124474                                                 /za/
3124475                                        /sign-up/cart
3124476                                           /checkout/
3124477                                            /complete
3124478                                       /card-machines
3124479                                       /continue
3124480                             /blog/article/get-car...
3124481                             /blog/article/get-car...
3124482                                          /za/signup/
3124483                                 /credit-card-readers
3124484                                          /signup
3124485                                 /credit-card-readers
3124486                                   /create-account/v1
3124487                                 /credit-card-readers
3124488                                   /point-of-sale-app
3124489                                   /create-account/v1
3124490                                   /point-of-sale-app
3124491                                 /credit-card-readers

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    .str 方法对对象列进行操作。这些列中可能有非字符串值,因此pandas 为这些行返回NaN 而不是Falsenp 然后抱怨,因为这不是布尔值。

    幸运的是,有一个参数可以处理这个问题:na=False

    a["properties_path"].str.contains('blog', na=False)
    

    或者,您可以将条件更改为:

    a["properties_path"].str.contains('blog') == True
    #or
    a["properties_path"].str.contains('blog').fillna(False)
    

    示例

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'a': [1, 'foo', 'bar']})
    conds = df.a.str.contains('f')
    #0      NaN
    #1     True
    #2    False
    #Name: a, dtype: object
    
    np.select([conds], ['XX'])
    #ValueError: invalid entry 0 in condlist: should be boolean ndarray
    
    conds = df.a.str.contains('f', na=False)
    #0    False
    #1     True
    #2    False
    #Name: a, dtype: bool
    
    np.select([conds], ['XX'])
    #array(['0', 'XX', '0'], dtype='<U11')
    

    【讨论】:

      【解决方案2】:

      您的数据似乎有nan,所以conditionsnan,这打破了np.select。要解决此问题,您可以这样做:

      s = a["properties_path"].fillna('')
      

      并将每个条件中的a['properties_path'] 替换为s

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-29
        • 2011-07-02
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        相关资源
        最近更新 更多