2016-10-14 10 views
2

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

Весь мой код ниже. Это может показаться немного хаотичным, в основном моя конечная цель (немного преувеличенная) заключается в том, чтобы отображать разные строки разных выбранных столбцов в нескольких выбранных столбцах на несколько подзаголовков (следовательно, три встроенные для циклов, повторяющихся между различными группами ... если вы предлагаете более элегантное решение, я буду признателен, но это не главное, что нажимает на меня). Мне нужно построить логарифм некоторых значений из одного кадра данных + 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 отметил, this answer сделал трюк! Спасибо!

+2

Вы, кажется, использует 'Math.log()', 'не np.log()', как описано выше код. Отвечают ли они на ваши вопросы? http://stackoverflow.com/questions/16968433/error-when-trying-to-apply-log-method-to-pandas-data-frame-column-in-python http://stackoverflow.com/questions/23748842/understanding-math-errors-in-pandas-dataframes – Jason

+0

Нет, я попробовал оба. Ни один из них не работает. Но вы правы, я должен был дать оба примера, фиксируя это. – durbachit

+0

Как сказал Джейсон [этот ответ] (http://stackoverflow.com/questions/16968433/error-when-trying-to-apply-log-method-to-pandas-data-frame-column-in- python) сделал трюк! Спасибо! – durbachit

ответ

4

Проблема не что у вас есть 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

+0

Нет, к сожалению, это не имеет значения. Все те же сообщения об ошибках. (И мои реальные данные загружаются из файла csv, поэтому отсутствующие данные не должны отображаться как строки.) Но спасибо, по крайней мере, изменив пример, чтобы не путать людей! – durbachit

+0

@durbachit Можете ли вы опубликовать образец вашего информационного кадра? Возможно, 'df.head()' и 'df.dtypes' –

+0

интересно, спасибо за подсказку, данные относятся к типу 'object' – durbachit

Смежные вопросы