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ę NaN
s 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 № 1Problem 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