python避免在Dataframe中被零除

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

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

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

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

def foo(x,y):
    try:
        return x/y
    except ZeroDivisionError:
        return 0

foo(df.iloc[:,col_ind].mean(axis1),other.iloc[:,col_ind].mean(axis=1))

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

esyap4oy

esyap4oy1#

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

import numpy as np

df = pd.DataFrame(data=np.concatenate([np.random.randint(1,10, (10,7)), np.random.randint(0,3,(10,1))], axis=1),
            columns=[f"col_{i}" for i in range(7)]+["div"])

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不会捕获任何内容。

>>> import pandas as pd
>>> import numpy as np
>>> x = pd.DataFrame({'a': [0, 1, 2], 'b': [0, 0, 2]})
>>> x

   a  b
0  0  0
1  1  0
2  2  2

>>> x.a / x.b
0    NaN
1    inf
2    1.0
dtype: float64

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

>>> (x.a / x.b).replace(np.inf, np.nan)
0    NaN
1    NaN
2    1.0
dtype: float64

>>> (x.a / x.b).replace(np.inf, np.nan).fillna(0)
0    0.0
1    0.0
2    1.0
dtype: float64

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

ztyzrc3y

ztyzrc3y3#

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

相关问题