web-dev-qa-db-ja.com

列を操作するときにpandas dataframesで「ゼロ除算」を処理する方法は?

私は何百もの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)ゼロによる除算が発生した場合、これを「パス」するようにどのようにコーディングしますか?

7
ShanZhengYang

考慮すべき2つのアプローチ:

「データなし」の値を明示的にコーディングしてテストすることにより、ゼロ除算の状況が発生しないようにデータを準備します。

https://wiki.python.org/moin/HandlingExceptions で説明されているように、try/exceptペアでエラーが発生する可能性のある各除算をラップします(これには、使用するゼロ除算の例があります)

(x,y) = (5,0)
try:
  z = x/y
except ZeroDivisionError:
  print "divide by zero"

私はあなたのデータに実際にはゼロであるゼロが含まれている(そして欠損値ではない)状況を心配しています。

1
vielmetti

分母にゼロが実際にあるデータフレームを使用する方がおそらく便利でしょう(列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
18
Alexander
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
3
Kartik

これを試して:

df['one']/(df['two'] +.000000001)
2
Merlin

いつでも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

これが役に立てば幸い!どちらを選択してもかまいません(どちらも同じです)。

1
Christian