【问题标题】:Logarithm of a pandas series/dataframe熊猫系列/数据框的对数
【发布时间】: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 成功了!谢谢!

【问题讨论】:

标签: python pandas numpy matplotlib


【解决方案1】:

问题不是你有NaN 值,而是你没有NaN 值,你有字符串 "NaN" ufunc np.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很好地配合

【讨论】:

  • 不,很遗憾,这没有任何区别。仍然是相同的错误消息。 (而且我的真实数据是从 csv 文件加载的,因此丢失的数据不应显示为字符串。)但是谢谢,至少更改示例以免混淆人们!
  • @durbachit 您可以发布您的数据框示例吗?也许df.head()df.dtypes
  • 有趣,感谢提示,数据属于“对象”类型
  • @durbachit 那么它们很可能是字符串。 csv 可能在该列中有 NaN 字符串,这会导致读者将整个列解释为字符串。
  • @durbachit 啊!当您执行此操作时:HF = pd.DataFrame(index=hf.index,columns=r) 默认情况下会使用 dtype: object 列填充 HF。至少可以说奇怪的行为。
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2022-12-10
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多