【发布时间】:2016-10-14 03:16:32
【问题描述】:
简而言之:如何获得 pandas 数据框列的对数?
我认为numpy.log() 应该可以解决这个问题,但事实并非如此。我怀疑这是因为我的数据框中有一些NaNs?
我的整个代码如下。它可能看起来有点混乱,基本上我的最终目标(有点夸张)是将几个选定列中不同选定列的不同行绘制成几个子图(因此三个嵌入的 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 指出的那样,this answer 成功了!谢谢!
【问题讨论】:
-
您似乎使用的是
math.log(),而不是上面代码中描述的np.log()。这些能回答你的问题吗? stackoverflow.com/questions/16968433/…stackoverflow.com/questions/23748842/… -
不,我都试过了。它们都不起作用。但你是对的,我应该给出这两个例子,修复它。
-
正如@Jason 指出的那样,this answer 成功了!谢谢!
标签: python pandas numpy matplotlib