Estoy tratando de reprogramar mi código Stata en Python para mejorar la velocidad, y me señalaron en la dirección de PANDAS. Sin embargo, estoy teniendo dificultades para entender cómo procesar los datos.
Digamos que quiero iterar sobre todos los valores en el encabezado de columna 'ID'. Si ese ID coincide con un número específico, entonces quiero cambiar dos valores correspondientes FirstName y LastName.
En Stata se ve así:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
Entonces, esto reemplaza todos los valores en FirstName que corresponden con los valores de ID == 103 a Matt.
En PANDAS, estoy intentando algo como esto
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
No estoy seguro de a dónde ir desde aquí. ¿Algunas ideas?
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
Puede usar
map
, puede mapear valores de un diccionario o incluso una función personalizada.Suponga que este es su df:
Crea los dictados:
Y mapa:
El resultado será:
O use una función personalizada:
fuente
dict
se creó para el mapeo. De lo contrario, se puede realizar una verificación / limpieza en función de algo como:df.ID.isin(names.keys())
La pregunta original aborda un caso de uso limitado específico. Para aquellos que necesitan respuestas más genéricas, aquí hay algunos ejemplos:
Creando una nueva columna usando datos de otras columnas
Dado el marco de datos a continuación:
A continuación, agregamos una nueva
description
columna como una concatenación de otras columnas mediante la+
operación que se reemplaza para la serie. El formato de cadena de fantasía, cadenas f, etc.no funcionarán aquí, ya que se+
aplica a escalares y no a valores 'primitivos':Obtenemos
1 years
para el gato (en lugar de1 year
) que arreglaremos a continuación usando condicionales.Modificar una columna existente con condicionales
Aquí estamos reemplazando la
animal
columna original con valores de otras columnas y usamosnp.where
para establecer una subcadena condicional basada en el valor deage
:Modificar varias columnas con condicionales
Un enfoque más flexible es llamar
.apply()
a un marco de datos completo en lugar de a una sola columna:En el código anterior, la
transform_row(r)
función toma unSeries
objeto que representa una fila determinada (indicado poraxis=1
, el valor predeterminado deaxis=0
proporcionará unSeries
objeto para cada columna). Esto simplifica el procesamiento ya que podemos acceder a los valores 'primitivos' reales en la fila usando los nombres de las columnas y tener visibilidad de otras celdas en la fila / columna dada.fuente
np.where
es probablemente lo que está buscando, consulte, por ejemplo, stackoverflow.com/a/42540310/191246 pero también es posible que no pueda ajustar la lógica en una operación escalar, entonces necesitaría transformar explícitamente la celda numéricamente similar a cómo se hacetransform_row
Esta pregunta aún podría ser visitada con suficiente frecuencia como para que valga la pena ofrecer un apéndice a la respuesta del Sr. Kassies. La
dict
clase incorporada se puede subclasificar para que se devuelva un valor predeterminado para las claves "faltantes". Este mecanismo funciona bien para los pandas. Pero mira a continuación.De esta forma es posible evitar errores de claves.
Lo mismo se puede hacer de forma más sencilla de la siguiente manera. El uso del argumento 'predeterminado' para el
get
método de un objeto dict hace que sea innecesario subclasificar un dict.fuente