将 pandas DataFrame 保存在 apply 循环的中间

问题描述 投票:0回答:1

使用 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 使用计算值创建一个新系列,然后将其附加到数据框。

您知道如何在重新引发异常之前保存已计算的数据吗?

python pandas exception
1个回答
0
投票

我宁愿在自己的

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
© www.soinside.com 2019 - 2024. All rights reserved.