You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas使用groupby拆分列结构不一致的分组为独立DataFrame

问题根因

现有代码失效是两个原因导致的:

  • pandas的read_csv默认以文件中最长行的字段数为基准生成统一列结构,短行末尾自动填充NaN,从读入环节就把结构不同的分组强行塞进了同一张表,后续分组自然会携带大量无意义的空列
  • 代码本身存在语法错误:readcsv应为read_csv,sep='|'与index_col=False之间缺少逗号,且按|分割时,行首尾的分隔符会生成两列全空的无意义字段
可行方案

异构列的分组数据不要先强行读成统一结构的DataFrame,先逐行拆分分组,再为每个分组单独生成DataFrame即可,全程不会出现列截断、多余空列的问题。
完整实现代码:

import pandas as pd
from collections import defaultdict

group_records = defaultdict(list)

# 逐行读取文件,按首列分组存储
with open("your_file_path", "r", encoding="utf-8") as f:
    for raw_line in f:
        line = raw_line.strip()
        if not line:
            continue
        # 按|分割,过滤掉行首尾分隔符生成的空值
        fields = [field.strip() for field in line.split("|") if field.strip()]
        if not fields:
            continue
        # 首字段为分组标识,剩余内容存入对应分组
        group_id = fields[0]
        group_records[group_id].append(fields[1:])

# 为每个分组单独生成独立DataFrame
df_A = pd.DataFrame(group_records["A"])
df_B = pd.DataFrame(group_records["B"])
df_C = pd.DataFrame(group_records["C"])
效果说明

生成的三个DataFrame完全匹配对应分组的列结构,无多余空列、无数据截断:

  • df_A为2行5列,存储数值、姓名类数据
  • df_B为2行7列,存储身份、院系、姓名类数据
  • df_C为2行3列,存储场所、容量类数据

如果需要给各分组设置明确列名,在生成DataFrame时传入columns参数即可,例如给C组设置列名:

df_C = pd.DataFrame(group_records["C"], columns=["venue", "attribute", "value"])

注:如果坚持要先读成全量DataFrame再处理,分组后需要逐组丢弃全为NaN的列,写法为g = g.dropna(axis=1, how='all'),但这种方式内存占用更高,且一旦出现字段错位很难排查,不推荐使用。

内容的提问来源于stack exchange,提问作者sdoodle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:48:43