Python Pandas convierte el tipo de datos de columna

Sé que una pregunta como esta se ha preguntado a millones de tipos, pero hasta ahora no he podido encontrar una respuesta a esta pregunta.

He unido dos archivos .csv junto con Pandas y ahora me gustaría agregar algunas columnas más al nuevo archivo .csv unido y los valores se calculan en función de los datos ya disponibles.

Sin embargo, sigo recibiendo este error:

"The truth value of a is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()." 

Ahora que obviamente parece ser un problema con el tipo de datos de mi columna (que es todos los enteros), pero no he encontrado una forma (de trabajo) para establecer esa columna como números enteros.

Aquí está mi código:

 import pandas def nscap(ns): if ns  13: x = 13 return x df_1 = pandas.read_csv("a.csv", sep=';', names=["DWD_ID", "NS"], header=0) df_2 = pandas.read_csv("b.csv", sep=';', names=["VEG", "DWD_ID"], header=0) df_joined = pandas.merge(df_1, df_2, on="DWD_ID") df_joined["NS_Cap"] = nscap(df_joined["NS"]) 

Si me pongo

 df_joined["NS_Cap"] = nscap(20) 

el código funciona bien

He probado funciones como .astype (int) o .to_numeric () pero a menos que tuviera la syntax incorrecta, no funcionó para mí.

¡Gracias por adelantado!

Al igual que con el comentario de @ EdChum, necesitas usar clip(upper=13) o clip_upper(13) . Otra opción que puede ayudarlo a largo plazo con instancias como esta es usar apply con una función lambda. Este es un método versátil realmente ingenioso.

 import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(5,18,size=(5, 4)), columns=list('ABCD')) nscap = lambda x: min(x, 13) print df.head() print '-' * 20 df['NSCAP'] = df['D'].apply(nscap) print df.head() 

Resultado:

introduzca la descripción de la imagen aquí

Tome nota de las 2 últimas líneas de la segunda ttwig de datos.

Espero que esto ayude.

(A su código le falta un paréntesis al final de nscap(df_joined["NS"] .)

Como @EdChum y @TheLaughingMan escriben, clip_upper es lo que quieres aquí. Esta respuesta solo aborda la razón directa del error que está recibiendo.

En la funcion

 def nscap(ns): if ns <= 13: x = ns elif ns > 13: x = 13 return x 

efectivamente, ns <= 13 operaciones en un numpy.ndarray . Cuando se compara una matriz de este tipo con un escalar, se produce la transmisión y el resultado es una matriz en la que cada elemento indica si era cierto para ella o no.

Asi que

 if ns <= 13: 

se traduce en algo como

 if numpy.array([True, False, True, True]): 

y es imposible entender si esto es verdad o no. Ese es el error que está recibiendo: debe especificar si quiere decir si todas las entradas son verdaderas, si alguna entrada es verdadera, y así sucesivamente.