如何处理DataFrame中object类型空单元格,拆分发票为单行记录
解决方案:拆分单列DataFrame中的发票数据
原函数报错原因
你的自定义函数报错在fila_restante = fila_restante[col_vacia+1:],核心问题是**col_vacia是列名字符串,无法直接与整数1相加**,这会触发类型错误。此外,转置后处理多列的逻辑反而复杂化了问题,更高效的方式是直接在原始单列DataFrame上操作。
正确实现步骤
原始数据是单列结构,用空字符串('')分隔不同发票,我们可以通过分组标识+透视转换的方式,将每个发票转为一行:
完整代码示例
import pandas as pd # 假设你的原始单列DataFrame为df,列名为"Columna 1" # 步骤1:生成发票分组ID——每遇到一个空字符串,分组ID自增1 df['invoice_id'] = (df['Columna 1'] == '').cumsum() # 步骤2:过滤掉空行(分隔用的空单元格) df_filtered = df[df['Columna 1'] != ''].copy() # 步骤3:为每个发票内的字段分配顺序序号 df_filtered['field_order'] = df_filtered.groupby('invoice_id').cumcount() # 步骤4:透视转换——将同发票的多行字段转为一行多列 df_invoices = df_filtered.pivot( index='invoice_id', columns='field_order', values='Columna 1' ).reset_index(drop=True) # 可选:为列命名(根据实际发票字段含义调整) df_invoices.columns = [f'发票字段_{i+1}' for i in df_invoices.columns]
代码说明
- 分组ID生成:利用
cumsum()累计空字符串的出现次数,自动为每个发票分配唯一ID。 - 过滤空行:移除用于分隔发票的空单元格,只保留有效发票数据。
- 字段序号:给每个发票内的字段按顺序编号,确保透视后字段顺序正确。
- 透视转换:将每个发票的多行数据转为一行,实现“每行对应一张发票”的需求。
优势
- 全程使用Pandas矢量化操作,比
iterrows()循环效率高得多,适合处理1000+行的数据集。 - 完美适配你提到的object类型空字符串(而非NaN)的场景,无需额外类型转换。
内容的提问来源于stack exchange,提问作者Ingrid
相关产品推荐
相关产品推荐

