Вкратце: Как я могу получить логарифм столбца блока данных 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 сделал трюк! Спасибо!
Вы, кажется, использует '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
Нет, я попробовал оба. Ни один из них не работает. Но вы правы, я должен был дать оба примера, фиксируя это. – durbachit
Как сказал Джейсон [этот ответ] (http://stackoverflow.com/questions/16968433/error-when-trying-to-apply-log-method-to-pandas-data-frame-column-in- python) сделал трюк! Спасибо! – durbachit