pandas:在DataFrame中记录单元格时有效避免0

时间:2018-03-10 09:51:21

标签: python pandas

我想在非常稀疏的pandas DataFrame中记录每个单元格的日志,并且必须避免使用0。起初我用lambda函数检查0,然后我认为用NaN替换多个0可能会更快。我从这个closely related question获得了一些灵感,并尝试使用"面具。"还有更好的方法吗?

# first approach
# 7.61 s ± 1.46 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
def get_log_1(df):
    return df.applymap(
        lambda x: math.log(x) if x != 0 else 0)

# second approach (faster!)
# 5.36 s ± 968 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
def get_log_2(df):
    return (df
            .replace(0, np.nan)
            .applymap(math.log)
            .replace(np.nan, 0))

# third apprach (even faster!!)
# 4.76 s ± 941 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
def get_log_3(df):
    return (df
            .mask(df <= 0)
            .applymap(math.log)
            .fillna(0))

1 个答案:

答案 0 :(得分:3)

一种可能的解决方案是使用numpy.log

print (np.log(df.mask(df <=0)).fillna(0))

或纯numpy

df1= pd.DataFrame(np.ma.log(df.values).filled(0), index=df.index, columns=df.columns)