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