python避免在Dataframe中被零除

djp7away  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(669)

很抱歉,以前有人问过这个问题,但我无法让这些解决方案为我工作(我是python的本地matlab用户)。
我有一个Dataframe,在这里我取一个df的前7列的行平均值,然后除以另一个。然而,这个数据集中有很多零,我想用零代替零除法错误(因为这对我来说很有意义),而不是自然返回的nan(因为我正在实现它)。
到目前为止我的代码是:

  1. col_ind = list(range(0,7))
  2. df.iloc[:,col_ind].mean(axis=1)/other.iloc[:,col_ind].mean(axis=1)

这里,如果other=0,则返回nan,但是如果df=0,则返回0。我尝试过很多提议的解决方案,但似乎都没有成功。例如:

  1. def foo(x,y):
  2. try:
  3. return x/y
  4. except ZeroDivisionError:
  5. return 0
  6. foo(df.iloc[:,col_ind].mean(axis1),other.iloc[:,col_ind].mean(axis=1))

但是,这将返回相同的值,而不使用定义的foo。我怀疑这是因为我操作的是级数而不是单个值,但我不确定也不知道如何修复它。在这些Dataframe中也有实际的nan。谢谢你的帮助。

esyap4oy

esyap4oy1#

您可以使用np.where有条件地将其作为向量化计算。

  1. import numpy as np
  2. df = pd.DataFrame(data=np.concatenate([np.random.randint(1,10, (10,7)), np.random.randint(0,3,(10,1))], axis=1),
  3. columns=[f"col_{i}" for i in range(7)]+["div"])
  4. np.where(df["div"].gt(0), (df.loc[:,[c for c in df.columns if "col" in c]].mean(axis=1) / df["div"]), 0)
8xiog9wr

8xiog9wr2#

不清楚您使用的是哪个版本,我也不知道行为是否依赖于版本,但是在Python3.8.5/1.2.4中,dataframe/系列中的0/0将计算为nan,而非0/0将计算为inf。两者都不会引发错误,因此try/except不会捕获任何内容。

  1. >>> import pandas as pd
  2. >>> import numpy as np
  3. >>> x = pd.DataFrame({'a': [0, 1, 2], 'b': [0, 0, 2]})
  4. >>> x
  5. a b
  6. 0 0 0
  7. 1 1 0
  8. 2 2 2
  9. >>> x.a / x.b
  10. 0 NaN
  11. 1 inf
  12. 2 1.0
  13. dtype: float64

可以将Dataframe或序列中的nan值替换为 fillna() 方法,并且可以使用标准 replace() :

  1. >>> (x.a / x.b).replace(np.inf, np.nan)
  2. 0 NaN
  3. 1 NaN
  4. 2 1.0
  5. dtype: float64
  6. >>> (x.a / x.b).replace(np.inf, np.nan).fillna(0)
  7. 0 0.0
  8. 1 0.0
  9. 2 1.0
  10. dtype: float64

(注意:负值除以零将计算为-inf,需要单独替换。)

展开查看全部
ztyzrc3y

ztyzrc3y3#

你可以替换 nan 使用df.fillna(0)计算后

相关问题