Логарифм серии панд / датафрейм

Вкратце: как я могу получить логарифм столбца кадра данных pandas? я думал numpy.log() должен работать над этим, но это не так. Я подозреваю, что это потому, что у меня есть некоторые NaNв кадре данных?

Весь мой код ниже. Это может показаться немного хаотичным, в основном моя конечная цель (немного преувеличенная) состоит в том, чтобы выстроить различные строки разных выбранных столбцов в нескольких выбранных столбцах в несколько вспомогательных участков (отсюда три встроенных цикла for, повторяющихся между различными группами... если вы предлагаете более элегантное решение, я буду признателен, но это не главное, что на меня давит). Мне нужно построить логарифм некоторых значений из одного кадра данных + 1 против некоторых значений другого кадра данных. И вот проблема, на графике с np.log я получаю эту ошибку: AttributeError: 'float' object has no attribute 'log' (и если я использую математику вместо np, я получаю это: TypeError: cannot convert the series to <type 'float'>) Что я могу с этим поделать?

Спасибо. Вот код:

import numpy as np
import math
import pandas as pd
import matplotlib.pyplot as plt

hf = pd.DataFrame({'Z':np.arange(0,100,1),'A':(10*np.random.rand(100)), 'B':(10*np.random.rand(100)),'C':(10*np.random.rand(100)),'D':(10*np.random.rand(100)),'E':(10*np.random.rand(100)),'F':(10*np.random.rand(100))})
df = pd.DataFrame({'Z':np.arange(0,100,1),'A':(10*np.random.rand(100)), 'B':(10*np.random.rand(100)),'C':(10*np.random.rand(100)),'D':(10*np.random.rand(100)),'E':(10*np.random.rand(100)),'F':(10*np.random.rand(100))})
hf.loc[0:5,'A']=np.nan
df.loc[0:5,'A']=np.nan
hf.loc[53:58,'B']=np.nan
df.loc[53:58,'B']=np.nan
hf.loc[90:,'C']=np.nan
df.loc[90:,'C']=np.nan
I = ['A','B']
II = ['C','D']
III = ['E','F']
IV = ['F','A']
runs = [I,II,III,IV]
inds = [10,20,30,40]

fig = plt.figure(figsize=(6,4))
for r in runs:
    data = pd.DataFrame(index=df.index,columns=r)
    HF = pd.DataFrame(index=hf.index,columns=r)
    #pdb.set_trace()
    for i in r:
        data.loc[:,i] = df.loc[:,i]
        HF.loc[:,i] = hf.loc[:,i]
        for c,z in enumerate(inds):
            ax=fig.add_subplot()
            ax = plt.plot(math.log1p(HF.loc[z]),Tdata.loc[z],linestyle=":",marker="o",markersize=5,label=inds[c].__str__())
# or the other version
#plt.plot(np.log(1 + HF.loc[z]),Tdata.loc[z],linestyle=":",marker="o",markersize=5,label=inds[c].__str__())

Как отметил @Jason, этот ответ сработал! Спасибо!

1 ответ

Проблема не в том, что у вас есть NaN ценности, это то, что у вас нет NaN значения, у вас есть строки "NaN" который ufuncnp.log не знает как с этим бороться Замените начало вашего кода на:

h = {'Z': np.arange(0,100,1), 'A': 10*np.random.rand(100),
     'B': 10*np.random.rand(100), 'C': 10*np.random.rand(100),
     'D': 10*np.random.rand(100), 'E': 10*np.random.rand(100),
     'F': 10*np.random.rand(100)}
hf = pd.DataFrame(h)
f = {'Z': np.arange(0,100,1), 'A': 10*np.random.rand(100),
     'B': 10*np.random.rand(100), 'C': 10*np.random.rand(100),
     'D': 10*np.random.rand(100), 'E': 10*np.random.rand(100),
     'F': 10*np.random.rand(100)}
df = pd.DataFrame(f)
hf.loc[0:5,'A'] = np.nan
df.loc[0:5,'A'] = np.nan
hf.loc[53:58,'B'] = np.nan
df.loc[53:58,'B'] = np.nan
hf.loc[90:,'C'] = np.nan
df.loc[90:,'C'] = np.nan

И все должно хорошо работать с np.log

Другие вопросы по тегам