很抱歉,以前有人问过这个问题,但我无法让这些解决方案为我工作(我是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。谢谢你的帮助。
3条答案
按热度按时间esyap4oy1#
您可以使用np.where有条件地将其作为向量化计算。
8xiog9wr2#
不清楚您使用的是哪个版本,我也不知道行为是否依赖于版本,但是在Python3.8.5/1.2.4中,dataframe/系列中的0/0将计算为nan,而非0/0将计算为inf。两者都不会引发错误,因此try/except不会捕获任何内容。
可以将Dataframe或序列中的nan值替换为
fillna()
方法,并且可以使用标准replace()
:(注意:负值除以零将计算为-inf,需要单独替换。)
ztyzrc3y3#
你可以替换
nan
使用df.fillna(0)计算后