【问题标题】:How to use math.log10 function on whole pandas dataframe如何在整个熊猫数据框上使用 math.log10 函数
【发布时间】:2019-07-28 04:51:46
【问题描述】:

我想取熊猫数据框中每个值的对数。我已经尝试过了,但它不起作用:

#Reading data from excel and rounding values on 2 decimal places
import math
import pandas as pd

data = pd.read_excel("DataSet.xls").round(2)
log_data= math.log10(data)

它给了我这个错误:

TypeError:必须是实数,不是DataFrame

你知道该怎么做吗?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    看起来math.log10 既不能处理pandas 数据帧也不能处理ndarrays。

    因此,一种选择是使用 numpy,它还包括一个计算以 10 为底的对数 np.log10 的函数,并按照其他解决方案中的说明重建数据帧。

    或者如果您想使用math.log10,并且同样适用于其他无法直接矢量化的函数,您可以使用DataFrame.applymap 将math.log10 应用于数据帧元素。但请注意,此解决方案将比使用 np.log10 的矢量化方法慢。


    用例

    这是一个如何使用DataFrame.applymap 完成此操作的示例:

    df = pd.DataFrame(np.random.randint(1,5,(6,6)), columns=list('abcdef'))
    
    print(df)
       a  b  c  d  e  f
    0  3  4  1  1  2  1
    1  4  4  4  3  4  1
    2  4  3  3  1  4  1
    3  3  4  1  3  1  1
    4  1  2  3  4  2  1
    5  1  3  3  1  4  3
    
    df.applymap(math.log10)
    
          a         b         c         d        e         f
    0  0.477121  0.602060  0.000000  0.000000  0.30103  0.000000
    1  0.602060  0.602060  0.602060  0.477121  0.60206  0.000000
    2  0.602060  0.477121  0.477121  0.000000  0.60206  0.000000
    3  0.477121  0.602060  0.000000  0.477121  0.00000  0.000000
    4  0.000000  0.301030  0.477121  0.602060  0.30103  0.000000
    5  0.000000  0.477121  0.477121  0.000000  0.60206  0.477121
    

    对于numpy 解决方案,您可以获取数据帧的np.log10,并将其重构为:

    pd.DataFrame(np.log10(data), index=df.index, columns=df.columns)
    

    【讨论】:

      【解决方案2】:

      您可能想使用applymap 方法将math.log10 应用于整个数据帧,这里是documentation。

      你可以测试一下:

      df.applymap(math.log10)
      

      【讨论】:

        【解决方案3】:

        使用 numpy 版本,而不是数学版本

        import numpy as np
        
        np.log10(df)
        

        【讨论】:

        • 谢谢我的朋友!!!如果 pandas 数据框中的某些值为 0,您知道该怎么做吗?然后,我不能使用日志功能
        • (注意,如果numpy没有你想要的等价函数,你也可以使用np.vectorize(function)将任何标量函数变成向量函数。)
        • @Aleksandar 在这一点上,您必须决定要在零点上发生什么。 Numpy 可以轻松处理您选择的任何内容。
        • @ChristophBurschka:但如果你这样做,它会比“本机”矢量化函数慢得多,并且如果你不注意具有一致的输出 dtypes,它会产生 silently wrong results。
        猜你喜欢
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-04
        • 2020-02-17
        • 2019-12-10
        • 2022-10-06
        相关资源
        最近更新 更多