/ / Logarytm z serii pand / ramki danych - python, pandy, numpy, matplotlib

Logarytm z serii pand / ramki danych - python, pandy, numpy, matplotlib

W skrócie: Jak mogę uzyskać logarytm kolumny pandasowej ramki danych? myślałem numpy.log() powinien nad tym popracować, ale tak nie jest. Podejrzewam, że to dlatego, że mam trochę NaNs w ramce danych?

Mój cały kod znajduje się poniżej. Może wydawać się nieco chaotyczna, w zasadzie moim ostatecznym celem (trochę przesadzonym) jest narysowanie różnych rzędów różnych wybranych kolumn w kilku wybranych kolumnach na kilka wątków (stąd trzy osadzone dla pętli iterujących pomiędzy różnymi grupami ... jeśli sugerujesz bardziej eleganckie rozwiązanie, doceniam to, ale to nie jest najważniejsze, co mnie naciska) Potrzebuję wykreślić logarytm niektórych wartości z jednej ramki danych + 1 w porównaniu do niektórych wartości drugiej ramek danych. I tutaj jest problem, na linii kreślarskiej z np.log pojawia się ten błąd: AttributeError: "float" object has no attribute "log" (i jeśli użyję matematyki zamiast np, otrzymam to: TypeError: cannot convert the series to <type "float">) Co mogę z tym zrobić?

Dziękuję Ci. Oto kod:

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__())

Jak zauważył @Jason, ta odpowiedź załatwił sprawę! Dziękuję Ci!

Odpowiedzi:

4 dla odpowiedzi № 1

Problem nie jest taki, jaki masz NaN wartości, to ty don "t mieć NaN wartości, masz smyczki "NaN" który ufunc np.log nie wiesz, jak sobie z tym poradzić. Zamień początek kodu na:

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

I wszystko powinno dobrze działać z np.log