为何计算结果为numpy数组?pandas财务数据处理异常排查
问题:手动数值纳入计算后结果变为数组格式
使用pandas处理银行导出的Excel客户数据时,将两个手动计算的数值(异常产品金额、信用卡支出)加入计算后,结果出现异常:Anomalos、Otros Gastos Tarjetas de Credito显示为元组格式,Margen Bruto和Utilidad Neta Total显示为数组格式,而非预期的单个数值。
相关代码
import pandas as pd from IPython.display import display from passremove import remove_pass from datetime import date # importar los excels necesarios passwd = 'PATA' aper_file = 'GALICIA resumen 2023-01-31 en proceso.xlsx' aper_excel = remove_pass(aper_file, passwd) today = date.today() # se crean los dataframes necesarios aper = pd.read_excel(aper_excel, sheet_name='aper', header=1) fc_apernet = pd.read_excel(aper_excel, sheet_name='FC APERNET', header=0) fc_apernet = fc_apernet.drop(fc_apernet.index[-1]) # configuramos las variables para armar el dict fact_banco = aper['Equivalencia Puntos en Pesos $'].sum() / 1.21 fact_tipitos = aper['Total pagado en $'].sum() / 1.21 fact_correo = aper['Cantidad'].sum()*1573 / 1.21 * -1 venta_productos = fact_banco + fact_tipitos + fact_correo costo_productos = aper['COSTO TOTAL PESOS'].sum() * -1 anomalos = -3,376.19 gastos_tarjeta = -15,853.09 otros_apernet = fc_apernet['Gravado 21'].sum()* - 1 margen_bruto = venta_productos + costo_productos + otros_apernet + anomalos + gastos_tarjeta iibb = venta_productos * 0.05 * -1 impuesto_cheque = venta_productos * 1.21 * 0.012 * -1 seg_hig = venta_productos * 0.0098 * -1 util_neta = margen_bruto + iibb + impuesto_cheque + seg_hig canjes_facturados = aper['Cantidad'].sum() resumen_dict = { 'Categoria': [ 'Facturacion al banco', 'Facturacion tipitos', 'Facturacion al Correo', 'Total Venta Solo Productos', 'Costo Productos', 'Anomalos', 'Otros Gastos Tarjetas de Credito', 'Otros Gastos Apernet', 'Margen Bruto', 'IIBB', 'Impuesto al Cheque', 'Seg e Hig', 'Utilidad Neta Total', 'Canjes Facturados' ], 'Valor': [ fact_banco, fact_tipitos, fact_correo, venta_productos, costo_productos, anomalos, gastos_tarjeta, otros_apernet, venta_productos + costo_productos + otros_apernet - anomalos - gastos_tarjeta, iibb, impuesto_cheque, seg_hig, util_neta, canjes_facturados ] } resumen_df = pd.DataFrame(resumen_dict) resumen_df = resumen_df.set_index('Categoria') resumen_df['Valor'] = resumen_df['Valor'].replace( '[\$,)]','', regex=True ) resumen_df.to_excel('Resumen Original {}.xlsx'.format(today)) with pd.option_context('display.max_columns', None): display(resumen_df)
计算结果
| Categoria | Valor |
|---|---|
| Facturacion al banco | 631777.892562 |
| Facturacion tipitos | 370955.165289 |
| Facturacion al Correo | -247000.0 |
| Total Venta Solo Productos | 755733.057851 |
| Costo Productos | -624018.7808 |
| Anomalos | (-3, 376.19) |
| Otros Gastos Tarjetas de Credito | (-15, 853.09) |
| Otros Gastos Apernet | -69645.32 |
| Margen Bruto | [62086.9570512395, 60839.6770512395] |
| IIBB | -37786.652893 |
| Impuesto al Cheque | -10973.244 |
| Seg e Hig | -7406.183967 |
| Utilidad Neta Total | [5884.876191735375, 7132.156191735374] |
| Canjes Facturados | 190 |
问题原因与解决方案
核心原因
Python中,逗号是元组的分隔符,而非千位分隔符。你在定义手动数值时使用了逗号:
anomalos = -3,376.19 # 实际创建了元组 (-3, 376.19),而非单个数值 -3376.19 gastos_tarjeta = -15,853.09 # 实际创建了元组 (-15, 853.09),而非单个数值 -15853.09
当pandas的数值(本质是numpy.float64类型)与元组进行运算时,numpy会执行广播操作,将数值与元组中的每个元素分别计算,最终得到数组格式的结果。
修正方法
将手动数值中的逗号去掉,改为正确的单个数值:
# 修正后的赋值 anomalos = -3376.19 gastos_tarjeta = -15853.09
同时注意代码中Margen Bruto的计算逻辑:原代码中字典里的计算式是venta_productos + costo_productos + otros_apernet - anomalos - gastos_tarjeta,而前面定义margen_bruto变量时是+ anomalos + gastos_tarjeta,需根据实际业务逻辑确认符号是否正确。
修正后,所有计算结果将恢复为单个数值,不会再出现元组或数组格式。
内容的提问来源于stack exchange,提问作者Fran Lanusse
相关产品推荐
相关产品推荐

