/ / Logaritmo di una serie di pandas / dataframe - python, panda, numpy, matplotlib

Logaritmo di una serie di pandas / dataframe - python, panda, numpy, matplotlib

In breve: come posso ottenere un logaritmo di una colonna di un dataframe panda? ho pensato numpy.log() dovrebbe lavorarci sopra, ma non è così. Sospetto che sia perché ne ho un po ' NaNs nel dataframe?

Il mio intero codice è sotto. Può sembrare un po 'caotico, fondamentalmente il mio obiettivo finale (un po' esagerato) è quello di tracciare diverse file di colonne selezionate diverse in diverse colonne selezionate in diverse sottotrame (da qui i tre incorporati per cicli iterando tra gruppi diversi ... se suggerisci un soluzione più elegante, lo apprezzerò ma non è la cosa principale che mi preme) Devo tracciare un logaritmo di alcuni valori da un dataframe + 1 rispetto ad alcuni valori dell'altro dataframe. Ed ecco il problema, sulla linea di tracciamento con np.log ottengo questo errore: AttributeError: "float" object has no attribute "log" (e se uso matematica invece di np, ottengo questo: TypeError: cannot convert the series to <type "float">) Cosa posso fare al riguardo?

Grazie. Ecco il codice:

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

Come ha sottolineato @Jason, questa risposta ha fatto il trucco! Grazie!

risposte:

4 per risposta № 1

Il problema non è quello che hai NaN valori, è questo che tu don "t avere NaN valori, hai stringhe "NaN" quale il ufunc np.log non sa come comportarsi. Sostituisci l'inizio del tuo codice con:

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

E tutto dovrebbe funzionare bene con np.log