2016-10-14 12 views
2

要約:パンダのデータフレームの列の対数を取得するにはどうすればよいですか? 私はnumpy.log()がそれに取り組むべきだと考えましたが、そうではありません。データフレームにNaNがいくつかあるので私はそれが疑わしいですか?パンダシリーズ/データフレームの対数

私のコード全体は以下の通りです。基本的に私の究極の目標(ちょっと誇張して)は、いくつかの選択された列の異なる選択された列の行をいくつかのサブプロットにプロットすることです(したがって、異なるグループ間でループを繰り返します。より洗練されたソリューション、私はそれを感謝するが、それは私を押す主要な事ではない)。あるデータフレームの値の対数と他のデータフレームのある値の対数をプロットする必要があります。そして、ここに問題があります.np.logのプロットラインで、私はこのエラーを受け取ります:AttributeError: 'float' object has no attribute 'log'(もしnpの代わりにmathを使うなら、私はこれを得ます: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

とうまく動作するはずです:で、あなたのコードの先頭を置き換えコード。これらはあなたの質問に答えますか? 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

@ Jasonが指摘したように、[この回答](http://stackoverflow.com/questions/16968433/error-when-trying-to-apply-log-method-to-pandas-data-frame-column-in- python)がトリックをやった!ありがとうございました! – durbachit

答えて

4

問題は、あなたがNaN値を持っていることではありませんが、それはNaN値を持っている、あなたはufuncnp.logが対処する方法を知らない文字列"NaN"を持っていないあなたがということです。あなたは上記のように `math.log()`、 `ない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

+0

いいえ、残念ながら、違いはありません。それでも同じエラーメッセージ。 (実際のデータはCSVファイルからロードされるので、欠落したデータは文字列として表示されるべきではありません。)しかし、少なくとも例を人を混乱させないように変更してくれてありがとう! – durbachit

+0

@durbachitデータフレームのサンプルを投稿できますか?おそらく 'df.head()'と 'df.dtypes' –

+0

のおかげで、チップのおかげで、データは 'オブジェクト'のタイプです – durbachit