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
最后一个问题是,在我处理数十亿行时,如何有效地执行此操作。可能有更好的方法,但现在我所做的是: 将我的专栏分为三类:
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)))