gpt4 book ai didi

python - 为什么 Pandas 在一种情况下会导致 'ZeroDivisionError' 而在另一种情况下不会?

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:40 26 4
gpt4 key购买 nike

我有一个 Pandas 数据框 'dt = myfunc()' ,并从 IDLE 复制屏幕输出如下:

>>> from __future__ import division
>>> dt = __get_stk_data__(['*'], frq='CQQ', from_db=False) # my function
>>> dt = dt[dt['ebt']==0][['tax','ebt']]
>>> type(dt)
<class 'pandas.core.frame.DataFrame'>
>>> dt
tax ebt
STK_ID RPT_Date
000719 20100331 0 0
20100630 0 0
20100930 0 0
20110331 0 0
002164 20080331 0 0
300155 20120331 0 0
600094 20090331 0 0
20090630 0 0
20090930 0 0
600180 20090331 0 0
600757 20110331 0 0
>>> dt['tax_rate'] = dt.tax/dt.ebt
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\Python\Lib\site-packages\pandas\core\series.py", line 72, in wrapper
return Series(na_op(self.values, other.values),
File "D:\Python\Lib\site-packages\pandas\core\series.py", line 53, in na_op
result = op(x, y)
ZeroDivisionError: float division
>>>

我花了很多时间来弄清楚为什么 Pandas 会引发 'ZeroDivisionError: float division' ,而 Pandas 对于以下示例代码工作得很好:

tuples = [('000719','20100331'),('000719','20100930'),('002164','20080331')]
index = MultiIndex.from_tuples(tuples, names=['STK_ID', 'RPT_Date'])
dt =DataFrame({'tax':[0,0,0],'ebt':[0,0,0]},index=index)
dt['tax_rate'] = dt.tax/dt.ebt

>>> dt
ebt tax tax_rate
STK_ID RPT_Date
000719 20100331 0 0 NaN
20100930 0 0 NaN
002164 20080331 0 0 NaN
>>>

我希望 Pandas 在这两种情况下都提供“NaN”,为什么在第一种情况下会出现“ZeroDivisionError”?如何解决?


附上以下代码和屏幕输出以提供进一步的调试信息

def __by_Q__(df):
''' this function transforms the input financial report data (which
is accumulative) to qurterly data
'''
df_q1=df[df.index.map(lambda x: x[1].endswith("0331"))]

print 'before diff:\n'
print df.dtypes
df_delta = df.diff()
print '\nafter diff: \n'
print df_delta.dtypes


q1_mask = df_delta.index.map(lambda x: x[1].endswith("0331"));
df_q234 = df_delta[~q1_mask]

rst = concat([df_q1,df_q234])

rst=rst.sort_index()
return rst

屏幕输出:

before diff:

sales float64
discount object
net_sales float64
cogs float64
ebt float64
tax float64

after diff:

sales object
discount object
net_sales object
cogs object
ebt object
tax object

最佳答案

@bigbug,你如何从 SQLite 后端获取数据?如果您查看 pandas.io.sqlread_frame 方法有一个 coerce_float 参数,如果可能,该参数应将数值数据转换为 float 。

您的第二个示例之所以有效,是因为 DataFrame 构造函数试图巧妙地处理类型。如果将 dtype 设置为 object 则它会失败:

In [16]: dt = DataFrame({'tax':[0,0,0], 'ebt':[0,0,0]},index=index,dtype=object)

In [17]: dt.tax/dt.ebt
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)

再次检查您的数据导入代码,让我知道您发现了什么?

关于python - 为什么 Pandas 在一种情况下会导致 'ZeroDivisionError' 而在另一种情况下不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com