代码之家  ›  专栏  ›  技术社区  ›  BogdanC

在表达式中使用函数名进行数据帧求值

  •  1
  • BogdanC  · 技术社区  · 7 年前

    我试着用 df.eval 对包含函数调用的表达式求值-在我的示例中是 numpy.around 我已经在本地命名空间中导入了。根据文件,使用 @ 函数名之前应该执行此操作,但它会抛出此错误

    我做错什么了?在IDE(Spyder/Jupyter笔记本)或控制台中重新运行后不工作。

    import numpy as np
    import pandas as pd
    from numpy import around
    
    
    df = pd.DataFrame({'x':np.array([1.12,2.76])})
    
    # this throws TypeError: 'Series' objects are mutable, thus they cannot be hashed
    df['y'] = df.eval('@around(x,1)')
    
    # this works
    df['z'] = around(df['x'],1)
    
    print(pd.__version__)
    # 0.23.4
    
    print(np.__version__)
    # 1.15.1
    
    import sys
    print(sys.version)
    # 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   BogdanC    7 年前

    解决方法更简单,无需删除 numexpr

    df['y'] = df.eval('@around(x,1)', engine = 'python')
    

    第一个答案

    conda 自身和所有包(包括 python 到3.7.0,但我不认为Python版本是相关的)。之后:

    pandas numpy

    conda remove pandas numpy
    
    The following packages will be REMOVED:
    
        bokeh:        0.13.0-py37_0
        mkl_fft:      1.0.4-py37h1e22a9b_1
        mkl_random:   1.0.1-py37h77b88f5_1
        numba:        0.39.0-py37h830ac7b_0
        numexpr:      2.6.8-py37h9ef55f4_0
        numpy:        1.15.1-py37ha559c80_0
        pandas:       0.23.4-py37h830ac7b_0
        scikit-learn: 0.19.1-py37hae9bb9f_0
        scipy:        1.1.0-py37h4f6bf74_1
    

    步骤2:仅重新安装 熊猫

        conda install pandas numpy
    
        The following NEW packages will be INSTALLED:
    
        mkl_fft:    1.0.4-py37h1e22a9b_1  
        mkl_random: 1.0.1-py37h77b88f5_1  
        numpy:      1.15.1-py37ha559c80_0  
        pandas:     0.23.4-py37h830ac7b_0  
    

    在第2步之后,代码按预期工作,因此问题一定出在其他被删除的包中。

    步骤3:逐个添加最初删除的每个包(bokeh、numba、numexpr、sciket learn、scipy),并每次测试代码是否仍然有效。安装后 numexpr公司 numpexpr 又回来了-我尝试了一些旧版本,但每次代码都失败了