使用 pandas 时,需要使用
apply
或 map
功能。就我而言,我有很长(14 小时)的数据处理工作要做,如果中间出现任何错误,我想保存 DataFrame。
为了具体说明模式,请考虑以下代码
import pandas as pd
from math import log
data = pd.DataFrame()
data['x'] = [1,2,-1,4,5]
try:
data['y'] = data['x'].apply(log)
except Exception as e:
data.to_pickle('data.pkl')
raise(e)
执行时,在尝试计算
ValueException
时会引发 log(-1)
。我想保存已经计算的数据并重新引发异常。
不幸的是,这不起作用。当你尝试时
data_bis = pd.read_pickle('data.pkl')
print(data_bis)
您只能得到 x 列。据我了解,首先 pandas 使用计算值创建一个新系列,然后将其附加到数据框。
您知道如何在重新引发异常之前保存已计算的数据吗?
我宁愿在自己的
math.log
中使用try/except
来捕获问题并发送None
def my_log(x):
try:
return log(x)
except ValueError:
return None
data['y'] = data['x'].apply(my_log)
或者我会使用
numpy.log()
因为它返回 NaN
而不是引发错误:
import numpy as np
data['z'] = data['x'].apply(np.log)
完整的工作示例:
import pandas as pd
import math
import numpy as np
def my_log(x):
try:
return math.log(x)
except ValueError:
return None
data = pd.DataFrame()
data['x'] = [1,2,-1,4,5]
data['y'] = data['x'].apply(my_log)
data['z'] = data['x'].apply(np.log)
print(data)
结果:
x y z
0 1 0.000000 0.000000
1 2 0.693147 0.693147
2 -1 NaN NaN
3 4 1.386294 1.386294
4 5 1.609438 1.609438