操作列时如何处理 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) 如果遇到被零除的情况,我如何将其编码为“通过”?

原文由 ShanZhengYang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

要考虑的两种方法:

通过显式编码“无数据”值并对其进行测试,准备您的数据,以免出现被零除的情况。

try / except 对包装可能导致错误的每个分区,如 https://wiki.python.org/moin/HandlingExceptions 所述(除以零示例使用)

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

我担心您的数据包含一个真正为零(而不是缺失值)的零的情况。

原文由 vielmetti 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用分母中实际为零的数据框可能更有用(请参阅列的最后一行 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

当其中一个值为零时,您应该在结果中得到 inf-inf 。转换这些值的一种方法如下:

 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

原文由 Alexander 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题