如何将pandas Series中的值按分类拆分为字典或DataFrame?
实现思路
因为不能通过字符串规则模糊匹配分类项,我们可以基于已知的分类项列表或者分类项位置标记,给每个子元素关联所属分类,最终可输出字典或宽表DataFrame满足访问需求。
步骤1:构造测试Series(你可以跳过这步直接替换为自己的Series)
import pandas as pd # 构造示例Series s = pd.Series([ 'ITEM1', 'Element1', 'Element2', 'Element3', 'Element4', 'Element5', 'Element6', 'Element7', 'ITEM2', 'Element8', 'ELEMENT9', 'ELEMENT10', 'Element11', 'Element12', 'Element13', 'Element14', 'Element2', 'Element24', 'Element25', 'Element26', 'ITEM3', 'Element28' ], name='Items') # 预先定义已知的分类项列表(实际业务中直接替换为你的分类项即可) categories = ['ITEM1', 'ITEM2', 'ITEM3']
步骤2:标记每个元素所属的分类
# 标记当前行是否为分类项,如果分类项位置已知也可以直接通过索引标记:is_category = s.index.isin([0,8,20]) is_category = s.isin(categories) # 给每个分组打标记,同一个分类下的所有元素标记值相同 group_label = is_category.cumsum() # 生成每个组对应的分类名映射 group_map = s[is_category].reset_index(drop=True).to_dict() # 给所有元素添加所属分类列 df = s.to_frame() df['group'] = group_label.map(group_map) # 过滤掉分类项本身,只保留子元素 child_df = df[~is_category].reset_index(drop=True)
步骤3:转换为你需要的格式
方案1:输出字典,通过键访问对应子元素
result_dict = child_df.groupby('group')['Items'].apply(list).to_dict() # 访问示例:result_dict['ITEM1'] 即可返回 ['Element1', 'Element2', ..., 'Element7']
方案2:输出宽表DataFrame,通过列名访问对应子元素
result_df = child_df.groupby(['group', child_df.groupby('group').cumcount()])['Items'].first().unstack(0) # 访问示例:result_df['ITEM1'] 即可返回ITEM1分类下的所有子元素,短分组对应列自动填充NaN
内容的提问来源于stack exchange,提问作者Ian Kurtis
相关产品推荐
相关产品推荐

