Как использовать функцию math.log10 на целом панде - PullRequest
9 голосов
/ 06 марта 2019

Я хочу взять логарифм каждого значения в кадре данных 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)

Это дает мне эту ошибку:

TypeError: должно быть действительным числом, а не DataFrame

У вас есть идеи, что делать?

Ответы [ 3 ]

21 голосов
/ 06 марта 2019

Используйте версию NumPy, а не математику

import numpy as np

np.log10(df)
12 голосов
/ 06 марта 2019

Из того, что кажется 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)
4 голосов
/ 06 марта 2019

Вы можете использовать метод applymap, чтобы применить math.log10 ко всему фрейму данных, вот документация .

Вы можете проверить это:

df.applymap(math.log10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...