/ / Logaritmo de una serie de pandas / marco de datos - python, pandas, numpy, matplotlib

Logaritmo de una serie de pandas / marco de datos - python, pandas, numpy, matplotlib

En resumen: ¿Cómo puedo obtener un logaritmo de una columna de un marco de datos de pandas? pensé numpy.log() debería trabajar en ello, pero no lo es. Sospecho que es porque tengo algunos NaNs en el marco de datos?

Mi código completo está abajo. Puede parecer un poco caótico, básicamente mi objetivo final (un poco exagerado) es trazar diferentes filas de diferentes columnas seleccionadas en varias columnas seleccionadas en varias subparcelas (por lo tanto, los tres incrustados para bucles que se repiten entre diferentes grupos ... si sugiere un Una solución más elegante, la apreciaré, pero no es lo principal lo que me está presionando. Necesito trazar un logaritmo de algunos valores de un marco de datos + 1 frente a algunos valores de otro marco de datos. Y aquí está el problema. en la línea de trazado con np.log me sale este error: AttributeError: "float" object has no attribute "log" (y si uso matemáticas en lugar de np, obtengo esto: TypeError: cannot convert the series to <type "float">) ¿Qué puedo hacer al respecto?

Gracias. Aquí está el código:

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

Como lo señaló @Jason, esta respuesta ¡Hizo el truco! ¡Gracias!

Respuestas

4 para la respuesta № 1

El problema no es que tengas NaN valores, es que tu no lo hagas tener NaN valores tienes instrumentos de cuerda "NaN" que la ufunc np.log no sabe cómo tratar. Reemplace el principio de su código 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

Y todo debería funcionar bien con np.log