1
以下の最小限の例では、pandas.DataFrame.apply
メソッドを自分のメソッドsafe_apply
でラップします。この方法は、2つの方法で、通常のapply
異なりますPythonのtry-catch-raise例外節の2回振る舞い
- 代わり
NDFrame
の値を返すので、それはリスト、results
にそれらを追加します。 - 例外がキャッチされると、エラーが発生して実行が終了する前に
results
が出力されます。ここ
コードである:
from pandas.core.frame import DataFrame, Series
import pandas as pd
def safe_apply(df, func, **kwargs):
results = []
def new_func(srs):
try:
results.append(func(srs))
except Exception as e:
print(results)
raise
df.apply(new_func, **kwargs)
return results
DataFrame.safe_apply = safe_apply
def f(srs):
if (pd.notnull(srs['lat'])) & (pd.notnull(srs['long'])):
return srs['lat'] + srs['long']
else:
raise ValueError
ex = pd.DataFrame({'lat': [1, 2, None], 'long': [1, 2, None]}, index=['A', 'B', 'C'])
ex.safe_apply(f, axis='columns')
私はこれを実行すると、Iはex
の最初の2行に機能f
を適用した後、第三のに失敗の結果を除い:のうちprint
ValueError
続い[2.0, 4.0]
は、代わりに、私は、出力のValueError
と2つの行を取得する:
results
をプリントアウトし、その代わりにエラーをスローし、停止、次いで、
が何らかの形で(?)再び機能を実行することを意味
[2.0, 4.0]
[2.0, 4.0, 2.0, 4.0]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-1-382c07ef0919> in <module>()
26 raise ValueError
27
---> 28 ex.safe_apply(f, axis='columns')
<ipython-input-1-382c07ef0919> in safe_apply(df, func, **kwargs)
12 raise
13
---> 14 df.apply(new_func, **kwargs)
15
16 return results
C:\Users\Alex\Anaconda3\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
4059 if reduce is None:
4060 reduce = True
-> 4061 return self._apply_standard(f, axis, reduce=reduce)
4062 else:
4063 return self._apply_broadcast(f, axis)
C:\Users\Alex\Anaconda3\lib\site-packages\pandas\core\frame.py in _apply_standard(self, func, axis, ignore_failures, reduce)
4155 try:
4156 for i, v in enumerate(series_gen):
-> 4157 results[i] = func(v)
4158 keys.append(v.name)
4159 except Exception as e:
<ipython-input-1-382c07ef0919> in new_func(srs)
7 def new_func(srs):
8 try:
----> 9 results.append(func(srs))
10 except Exception as e:
11 print(results)
<ipython-input-1-382c07ef0919> in f(srs)
24 return srs['lat'] + srs['long']
25 else:
---> 26 raise ValueError
27
28 ex.safe_apply(f, axis='columns')
ValueError: occurred at index C
。
これはなぜ発生するのですか?