¿Por qué pandas no suma mis montos? Números guardados como texto
Convierte montos con signo de pesos y comas en números, y cuenta lo que la conversión dejó vacío sin avisar.
Curso gratis. Tu Maestro, una IA, .
El inventario dijo que monto es de tipo str. Si la abres en una hoja de cálculo, ves "$7,784.00", "4,692", "14,130", "1722": cuatro maneras de escribir dinero en una misma columna, porque cada quien capturó como le pareció. Tú lees cantidades. pandas lee texto, y el texto no se suma: se pega.
Predice qué pasa en tres intentos de trabajar con montos así.
Sumar texto
Ejemplo 1 de 3
import pandas as pd
montos = pd.Series(["1250", "980"])
print(montos.sum())
Adivinar está bien: se guarda tal como la escribiste para compararla. Solo tú y tu Maestro ven tus predicciones.
Ejemplo 2 de 3, se abre cuando expliques este
Primero quita, después convierte, y al final cuenta
La conversión segura tiene tres pasos:
- Quita lo que no es número. El signo de pesos y la coma de los miles:
str.replace("$", "", regex=False)ystr.replace(",", "", regex=False). Elregex=Falsedeja claro que buscas ese carácter tal cual, no un patrón de búsqueda. Después,str.strip()por si quedó un espacio. - Convierte con
pd.to_numeric(..., errors="coerce"). Por omisión,to_numericse detiene con el primer valor que no entiende. Con"coerce"lo vuelve hueco y sigue. - Cuenta los huecos antes y después. Es el paso que nada te recuerda: si te lo saltas, nada falla. Si antes de convertir había 1 hueco y después hay 2, la conversión se comió un valor, y tienes que ir a ver cuál fue.
Cuidado con lo que coerce puede esconder. En la hoja de marzo, antes de convertir, monto tenía un hueco (la venta V-0036, pendiente de factura). Después de convertir hay dos. El segundo es la venta V-0050, que alguien capturó con la palabra "pendiente". Sin contar, ese monto habría desaparecido del total sin que nadie lo notara.
El hueco nuevo no es un error que tengas que corregir tú. Es otra pregunta para Marisol, y mientras contesta, lo dejas vacío y lo dices en el reporte.
¿Tu columna tiene montos con otro formato, como 1.250,00? Pregúntale a tu Maestro qué cambia.
Cuidado: Puntos y comas
En esta hoja la coma separa miles y el punto separa decimales. Hay hojas donde es al revés, y quitar las comas ahí cambia el valor. Antes de quitar cualquier carácter, mira varios montos completos y confirma qué hace cada signo en tu hoja.
Guarda el original mientras revisas
Un detalle que te va a ahorrar trabajo: mientras pruebas la conversión, ponla en una columna nueva (monto_num) y no sobre monto. Así puedes poner las dos lado a lado y ver qué texto produjo cada hueco. Si sobrescribes la columna, el "pendiente" desaparece y ya no hay nada que buscar. Cuando la conversión esté probada y la bitácora diga cuántos montos quedaron vacíos, en el script final puedes reemplazar la columna.
Y otra tentación: abrir la hoja, borrar "pendiente" a mano y escribir un monto que te parezca razonable. No lo hagas. Ese número no lo confirmó nadie, y el mes que entra vas a tener que acordarte de hacerlo otra vez. El código deja el hueco, la bitácora lo cuenta y Marisol decide.
Inténtalo
Convierte monto en la hoja de ventas completa y encuentra qué venta se perdió en la conversión. Si tu conteo de huecos no cambia y crees que algo anda mal, pregúntale a tu Maestro.
Quita el signo de pesos y las comas de monto, conviértelo con pd.tonumeric(..., errors="coerce") en una columna nueva montonum, y cuenta los huecos antes y después. Después imprime el folio y el monto original de cada venta que estaba escrita y ya no se convirtió. Terminaste cuan
Quita el signo de pesos y las comas de monto, conviértelo con pd.to_numeric(..., errors="coerce") en una columna nueva monto_num, y cuenta los huecos antes y después. Después imprime el folio y el monto original de cada venta que estaba escrita y ya no se convirtió. Terminaste cuando ves el conteo pasar de 1 a 2 y sabes qué folio lo causó.
Ejecuta tu código para ver lo que imprime y el valor de su última expresión. Cada ejecución empieza de nuevo. Ctrl+Enter ejecuta tu código. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu código.
Ejecuta tu código para ver su salida aquí.
Datos: ventas-cooperativa, 60 filas
Enter guarda una celda y Escape la deja como estaba. Deja una celda vacía para un valor faltante.
| Fila | Quitar | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | ||||||||||
| 2 | ||||||||||
| 3 | ||||||||||
| 4 | ||||||||||
| 5 | ||||||||||
| 6 | ||||||||||
| 7 | ||||||||||
| 8 | ||||||||||
| 9 | ||||||||||
| 10 | ||||||||||
| 11 | ||||||||||
| 12 | ||||||||||
| 13 | ||||||||||
| 14 | ||||||||||
| 15 | ||||||||||
| 16 | ||||||||||
| 17 | ||||||||||
| 18 | ||||||||||
| 19 | ||||||||||
| 20 |
Si lo hiciste bien, la venta que se perdió es V-0050, con "pendiente" escrito en el monto. Con los montos ya como número, la suma de la columna da 756,656 pesos. Antes de mandar ese número a nadie, contesta la pregunta de abajo.