私は何百ものpandasデータフレームを扱っています。典型的なデータフレームは次のとおりです:
import pandas as pd
import numpy as np
data = 'filename.csv'
df = pd.DataFrame(data)
df
one two three four five
a 0.469112 -0.282863 -1.509059 bar True
b 0.932424 1.224234 7.823421 bar False
c -1.135632 1.212112 -0.173215 bar False
d 0.232424 2.342112 0.982342 unbar True
e 0.119209 -1.044236 -0.861849 bar True
f -2.104569 -0.494929 1.071804 bar False
....
列の値を分割する特定の操作があります。
df['one']/df['two']
ただし、ゼロまたはその両方で除算する場合があります
df['one'] = 0
df['two'] = 0
当然、これはエラーを出力します:
ZeroDivisionError: division by zero
私は0/0が実際には「ここには何もない」を意味することを好みます。これは、データフレームでこのようなゼロが意味することが多いためです。
(a)これを「ゼロ除算」が0であることをどのようにコーディングしますか?
(b)ゼロによる除算が発生した場合、これを「パス」するようにどのようにコーディングしますか?
考慮すべき2つのアプローチ:
「データなし」の値を明示的にコーディングしてテストすることにより、ゼロ除算の状況が発生しないようにデータを準備します。
https://wiki.python.org/moin/HandlingExceptions で説明されているように、try
/except
ペアでエラーが発生する可能性のある各除算をラップします(これには、使用するゼロ除算の例があります)
(x,y) = (5,0)
try:
z = x/y
except ZeroDivisionError:
print "divide by zero"
私はあなたのデータに実際にはゼロであるゼロが含まれている(そして欠損値ではない)状況を心配しています。
分母にゼロが実際にあるデータフレームを使用する方がおそらく便利でしょう(列two
の最後の行を参照)。
one two three four five
a 0.469112 -0.282863 -1.509059 bar True
b 0.932424 1.224234 7.823421 bar False
c -1.135632 1.212112 -0.173215 bar False
d 0.232424 2.342112 0.982342 unbar True
e 0.119209 -1.044236 -0.861849 bar True
f -2.104569 0.000000 1.071804 bar False
>>> df.one / df.two
a -1.658442
b 0.761639
c -0.936904
d 0.099237
e -0.114159
f -inf # <<< Note division by zero
dtype: float64
値の1つがゼロの場合、結果にはinf
または-inf
が含まれます。これらの値を変換する1つの方法は次のとおりです。
df['result'] = df.one.div(df.two)
df.loc[~np.isfinite(df['result']), 'result'] = np.nan # Or = 0 per part a) of question.
# or df.loc[np.isinf(df['result']), ...
>>> df
one two three four five result
a 0.469112 -0.282863 -1.509059 bar True -1.658442
b 0.932424 1.224234 7.823421 bar False 0.761639
c -1.135632 1.212112 -0.173215 bar False -0.936904
d 0.232424 2.342112 0.982342 unbar True 0.099237
e 0.119209 -1.044236 -0.861849 bar True -0.114159
f -2.104569 0.000000 1.071804 bar False NaN
df['one'].divide(df['two'])
コード:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.Rand(5,2), columns=list('ab'))
df.loc[[1,3], 'b'] = 0
print(df)
print(df['a'].divide(df['b']))
結果:
a b
0 0.517925 0.305973
1 0.900899 0.000000
2 0.414219 0.781512
3 0.516072 0.000000
4 0.841636 0.166157
0 1.692717
1 inf
2 0.530023
3 inf
4 5.065297
dtype: float64
これを試して:
df['one']/(df['two'] +.000000001)
いつでもtryステートメントを使用できます。
try:
z = var1/var2
except ZeroDivisionError:
print ("0") #As python-3's rule is: Parentheses
または...
あなたも行うことができます:
if var1==0:
if var2==0:
print("0")
else:
var3 = var1/var2
これが役に立てば幸い!どちらを選択してもかまいません(どちらも同じです)。