Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将条件函数应用于数十亿个数据点_Python_Pandas_Numpy - Fatal编程技术网

Python 将条件函数应用于数十亿个数据点

Python 将条件函数应用于数十亿个数据点,python,pandas,numpy,Python,Pandas,Numpy,我有一个如下所示的数据帧: idx a b c d e f g h i j 1 0 17 17 83 17 0 21 16 21 4 2 -9 31 31 74 40 0 39 39 39 9 3 -27 0

我有一个如下所示的数据帧:

idx    a      b      c      d      e      f      g      h      i       j
1      0     17     17     83     17      0     21     16     21       4
2     -9     31     31     74     40      0     39     39     39       9
3    -27      0    -27     92     27    -37      3    -37     40      16
4     -4      0     -4     81      4     -1      5      5      6       9
我想申请:

where x>0: functionA(x)

where x<0: functionB(x)
无效值

/usr/local/anaconda3/envs/ds/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in log
      """Entry point for launching an IPython kernel.
这不应该发生,因为没有
NaN
值,并且我显式地选择了非零值

df.isnull().values.any()
False

最后一个问题是,在我处理数十亿行时,如何有效地执行此操作。

可能有更好的方法,但现在我所做的是:

将我的专栏分为三类:

  • (-inf,0)
  • (0,inf)
  • (-inf,inf)
  • 前两个很简单[1]:

    for i in [a, ...]:
        s = df[i]
        df[i] = np.where(s<0, -np.log(-s), s).astype('float32')
    
    [a,…]中的i的
    :
    s=df[i]
    df[i]=np.式中(s0:
    返回np.log(x)
    
    elif x您可以使用
    numpy.分段
    功能:

    将numpy导入为np
    正值=df.values>0
    负=df。值<0
    df[:]=np.分段(df.值,(正,负),(np.log,λx:-np.log(-x)))
    
    之前有人添加了此答案,然后将其删除:


    df=np.log(df.where(df>0)).fillna(-1*np.log(-1*df.where(df))将数字转换为浮点有什么问题?数字可能接近零,这会扰乱浮点数学。最好计算abs(x-0)float
    ,那么做的目的是什么de>log
    ?在加载/创建时,您始终可以将整个数据帧转换为
    float32
    。没有关于浮动的抱怨。问题是在同一数据帧上应用这两个操作。在一个操作后,df会变为带有日志值的float32。然后,无法再区分原始值vs log values,即value 0或log(1)=0?我已经从标题中删除了该部分,因为它不必要且容易混淆。它似乎应该可以工作,但我得到了以下错误:
    value错误:无法将大小为54572193的序列复制到尺寸为10的数组轴上
    负=df.values<0
    (逻辑_not of>为0负=df.values<0 df=np.分段(df.values,[正,负],[λx:np.log(x),λx:-np.log(-x)])
    @encore2097很抱歉在负片中包含0。我在最新编辑中修复了这一问题。我还添加了如何将新的
    numpy
    数组的值赋回到
    数据帧中。
    
    for i in [a, ...]:
        s = df[i]
        df[i] = np.where(s<0, -np.log(-s), s).astype('float32')
    
    def apply_log(x):
        if x>0:
            return np.log(x)
        elif x<0:
            return -np.log(-x)
        elif x == 0:
            return 0.0
        else:
            assert False
    
    import numpy as np
    positive = df.values > 0
    negative = df.values < 0
    df[:] = np.piecewise(df.values, (positive, negative), (np.log, lambda x: -np.log(-x)))