Pandas如何按_id分组拆分指定列生成未展开Series并保留关联列
Pandas按分隔符拆分列并关联原字段、分组生成未展开Series的实现方法
基础准备:构造示例数据
先复现测试数据集:
import pandas as pd df = pd.DataFrame({ 'ixd': [0], '_id': ['abc123'], 'systemA': ['1703.0|1144.0'], 'systemB': ['2172.0|735.0'] })
拆分单列后保留关联原有列的方法
不需要拆分后额外做关联操作,只要拆分时关闭展开参数,拆分结果会和原表行索引天然对齐,所有原有列自动关联:
# 拆分systemA列,expand=False表示不拆分为多列,结果为存储列表的Series df['systemA_cut'] = df['systemA'].str.split('|', expand=False)
执行后新列和原表所有行一一对应,ixd、_id、systemB等原有字段不会丢失,不需要额外做merge/join操作。
按_id分组拆分两列、生成未展开Series的方法
直接按_id分组后对目标列做拆分即可,全程保持expand=False就不会展开为多行/多列,最终得到以_id为索引的拆分结果:
# 按_id分组,对systemA、systemB同时做拆分,保留未展开的列表结构 split_series_result = df.groupby('_id')[['systemA', 'systemB']].apply( lambda group: group.apply( lambda col: col.str.split('|', expand=False).iloc[0] ) )
输出结构说明
执行后得到的结果索引为分组字段_id,每个分组下的systemA、systemB均为拆分后的列表,完全符合未展开的要求:
systemA systemB _id abc123 [1703.0, 1144.0] [2172.0, 735.0]
如果需要单独提取某一列的拆分Series,直接按列名索引即可,例如split_series_result['systemA']就是按_id分组、拆分后未展开的systemA列Series。
补充说明
如果同一个_id对应多条原始数据,只需要调整apply内的聚合逻辑即可,比如将同组所有拆分结果合并、去重,不需要改动整体拆分逻辑。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

