如何在整个熊猫数据框上使用math.log10函数

tag*_*aga 10 python numpy pandas

我想获取熊猫数据框中每个值的对数。我已经尝试过了,但是没有用:

#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)
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

TypeError:必须是实数,而不是DataFrame

你有什么想法吗?

eco*_*zar 22

使用numpy版本,而不是数学

import numpy as np

np.log10(df)
Run Code Online (Sandbox Code Playgroud)

  • (请注意,如果 numpy 没有您想要的等价函数,您也可以使用 `np.vectorize(function)` 将任何标量函数转换为向量函数。) (2认同)
  • @ChristophBurschka:但是如果你这样做,它会比“本地”向量化函数慢得多,并且如果你不小心的话,还会产生[默默地错误的结果](https://ideone.com/sTrs4l)具有一致的输出数据类型。 (2认同)

yat*_*atu 12

从看来,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
Run Code Online (Sandbox Code Playgroud)

对于numpy解决方案,您可以采用np.log10数据框的,并将其重建为:

pd.DataFrame(np.log10(data), index=df.index, columns=df.columns)
Run Code Online (Sandbox Code Playgroud)


Val*_*ier 8

您可能想使用该applymap方法应用于math.log10整个数据框,这里是文档

你可以测试一下:

df.applymap(math.log10)
Run Code Online (Sandbox Code Playgroud)