使用pd.groupby().agg()拼接行时遇到的问题
解决方法
问题出在两处:
- 分组逻辑不够明确,且变量名存在笔误(代码中的
df1未定义,应为原DataFramedf); - 直接对
MAJOR列执行拼接会把np.nan当作字符串混入结果,同时未明确指定各列的聚合规则,导致结果不符合预期。
以下是修正后的完整实现:
1. 核心思路
- 按
['NAME', 'STATE']分组(满足每个NAME对应唯一STATE的前提); - 对
MAJOR列先过滤空值,再用逗号拼接非空项; - 对
SCHOOL列直接拼接所有值(若存在空值可参照MAJOR的过滤逻辑)。
2. 完整代码
import pandas as pd import numpy as np # 构造原始数据 NAME = ['BOB', 'BOB', 'BOB', 'SUE', 'SUE', 'MARY', 'JOHN', 'JOHN', 'MARK', 'MARK', 'MARK', 'MARK'] STATE = ['CA','CA','CA','DC','DC','PA','GA','GA','NY','NY','NY','NY'] MAJOR = ['MARKETING','BUSINESS ADM',np.nan,'ECONOMICS','MATH','PSYCHOLOGY','HISTORY','BUSINESS ADM','MATH', 'MEDICAL SCIENCES',np.nan,np.nan] SCHOOL = ['UCLA','UCSB','CAL STATE','HARVARD','WISCONSIN','YALE','CHICAGO','MIT','UCSD','UCLA','CAL STATE','COMMUNITY'] data = {'NAME':NAME, 'STATE':STATE,'MAJOR':MAJOR, 'SCHOOL':SCHOOL} df = pd.DataFrame(data) # 分组聚合:明确指定每列的处理规则 result = df.groupby(['NAME', 'STATE']).agg( MAJOR=('MAJOR', lambda col: ', '.join(col.dropna())), SCHOOL=('SCHOOL', lambda col: ', '.join(col)) ).reset_index() print(result)
3. 输出结果
执行后得到结构化表格:
| NAME | STATE | MAJOR | SCHOOL |
|---|---|---|---|
| BOB | CA | MARKETING, BUSINESS ADM | UCLA, UCSB, CAL STATE |
| JOHN | GA | HISTORY, BUSINESS ADM | CHICAGO, MIT |
| MARK | NY | MATH, MEDICAL SCIENCES | UCSD, UCLA, CAL STATE, COMMUNITY |
| MARY | PA | PSYCHOLOGY | YALE |
| SUE | DC | ECONOMICS, MATH | HARVARD, WISCONSIN |
关键说明
- 使用
groupby(['NAME', 'STATE'])确保分组的唯一性,避免因列名筛选遗漏导致的逻辑错误; - 用
col.dropna()过滤MAJOR列的空值,避免无效字符串混入结果; agg()的字典式参数可以精准指定每一列的聚合规则,解决原代码仅返回单列的问题;reset_index()将分组索引转为普通列,得到符合需求的标准表格格式。
内容的提问来源于stack exchange,提问作者guperator
相关产品推荐
相关产品推荐

