【发布时间】:2018-02-18 11:17:53
【问题描述】:
我有一个如下所示的数据框:
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)
我独立尝试过的:
df[df>0] = np.log(df)
和
df[df<0] = -np.log(-df)
似乎有点工作..顺序运行这两个操作将不起作用,因为数据帧在第一次操作后从 int 转换为 float 并呈现原始值与 log 值不可区分,例如。是 0 还是 log(1) = 0 ?
我也担心这些错误:
除以零
usr/local/anaconda3/envs/ds/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in log
"""Entry point for launching an IPython kernel.```
无效值
/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
最后一个问题是在我处理数十亿行时如何有效地做到这一点。
【问题讨论】:
-
数字转换为浮点数有什么问题?
-
数字可能接近于零,这会影响浮点数学。最好计算 abs(x-0)
-
我没有转换为浮动部分。我知道日志可以计算出非常小的值,但是既然你抱怨得到
float,那么做log的目的是什么?在加载/创建时,您始终可以将整个数据框转换为float32 -
没有关于浮动的抱怨。问题是关于在同一个数据帧上应用这两个操作。一次操作后,df 被突变为具有 log 值的 float32。那么它不再可能区分原始值与日志值,即值 0 还是 log(1) = 0?我已经从标题中删除了该部分,因为它不必要且令人困惑。