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
相关产品推荐
相关产品推荐

