操作列时如何用熊猫数据框处理“除以零”? [复制]
Posted
技术标签:
【中文标题】操作列时如何用熊猫数据框处理“除以零”? [复制]【英文标题】:How to deal with "divide by zero" with pandas dataframes when manipulating columns? [duplicate] 【发布时间】:2016-12-17 14:40:19 【问题描述】:我正在使用数百个 pandas 数据框。一个典型的dataframe如下:
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) 如果遇到被零除,我将如何将其编码为“通过”?
【问题讨论】:
我无法写出答案,因为这已被标记为重复 (?) 但如果您只有一列为零的选项是这样做的:1 / (df.ColumnWithZeros / df.ColumnWithoutZeros)
这在数学上是等效的。就像 1 / (2 / 3) 等价于 3 / 2
df['one'].div(df['two']).replace(np.inf, 0)
相关:Handling division by zero in Pandas calculations
【参考方案1】:
需要考虑的两种方法:
通过显式编码“无数据”值并对其进行测试,准备好您的数据,以免出现被零除的情况。
使用try
/except
对包装每个可能导致错误的除法,如https://wiki.python.org/moin/HandlingExceptions 所述(其中有一个除以零的示例可供使用)
(x,y) = (5,0)
try:
z = x/y
except ZeroDivisionError:
print "divide by zero"
我担心您的数据中包含的零实际上是零(而不是缺失值)。
【讨论】:
Pandas(或 NumPy)不会引发 ZeroDivisionError。 @ayhan 我在使用 pandasdiv
函数时遇到了 ZeroDivisionError。文件“processing.py”,第 50 行,有趣 || df['pct'] = df['diffs', '2019-11-13'].divide(df['shares_latest']) ||文件“pandas/core/ops/__init__.py”,第 570 行,在 flex_wrapper || return self._binop(other, op, level=level, fill_value=fill_value) || _binop || 中的文件“pandas/core/series.py”,第 2618 行结果 = func(this_vals, other_vals) || ZeroDivisionError:浮点除以零【参考方案2】:
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'].div(df['two']).replace(np.inf, 0)
.【参考方案3】:
使用分母中实际上为零的数据框可能会更有用(请参阅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
【讨论】:
感谢您的解释; 'NaN' 插补非常有用。以后我会改进我的问题 我不认为这解决了关于 ZeroDivisionError 的问题。当我除以零时,我没有得到“inf”。我得到 ZeroDivisionError。【参考方案4】:你总是可以使用 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
希望这有帮助!选择您想要的任何选择(无论如何它们都是相同的)。
【讨论】:
if ((var1==0) && (var2==0)):
【参考方案5】:
试试这个:
df['one']/(df['two'] +.000000001)
【讨论】:
如果df['two'] == -0.000000001
怎么办?
这是一个可怕的答案;例如,如果分子不为零,这可能是任何东西
这没用。除了当数据恰好是 -1e-09 时,你会得到一个除以零的事实,根本不回答这个问题。 OP 已要求对分母中的 0 进行显式处理以输出 0 或其他一些缺失的数据标记值,例如南
请删除此答案。只需在分母上添加一个小数就意味着您移动到已经涵盖的无穷大...以上是关于操作列时如何用熊猫数据框处理“除以零”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章