如何在Pandas中按name列相似前缀分组并按type类别值求和?
实现按name前缀分组并结合type求和
核心思路
- 从
name列提取前缀(如AA:3400提取为AA) - 按前缀和
type列分组,对size求和 - 补全每个前缀下所有可能的
type类别(空值、TRUE、FALSE),缺失的求和值填0 - 调整行顺序匹配期望输出
完整代码
import pandas as pd # 构造原始数据 data = { 'name': ['AA:3400', 'AA:3401', 'AA:3402', 'AA:3404', 'AA:3409', 'AA:3410', 'AA:3412', 'BB:3400', 'BB:3401'], 'type': ['', 'FALSE', 'FALSE', 'FALSE', 'FALSE', 'FALSE', 'FALSE', 'TRUE', 'FALSE'], 'size': [5, 1, 2, 0, 1, 8, 9, 4, 7] } df = pd.DataFrame(data) # 步骤1:提取name列的前缀 df['prefix'] = df['name'].str.split(':').str[0] # 步骤2:按前缀和type分组求和(保留空值分组) grouped = df.groupby(['prefix', 'type'], dropna=False, as_index=False)['size'].sum() # 步骤3:生成所有前缀+type的组合,补全缺失的分组 prefixes = df['prefix'].unique() types = ['', 'TRUE', 'FALSE'] all_combinations = pd.MultiIndex.from_product([prefixes, types], names=['prefix', 'type']).to_frame(index=False) # 合并并填充缺失的size为0 result = pd.merge(all_combinations, grouped, on=['prefix', 'type'], how='left').fillna({'size': 0}) # 步骤4:调整列名、顺序和格式 result = result.rename(columns={'prefix': 'name'}) # 定义期望的行顺序 order = [('AA', 'TRUE'), ('AA', 'FALSE'), ('AA', ''), ('BB', 'TRUE'), ('BB', 'FALSE'), ('BB', '')] result['sort_key'] = pd.Categorical(list(zip(result['name'], result['type'])), categories=order, ordered=True) result = result.sort_values('sort_key').drop('sort_key', axis=1).astype({'size': int}) # 若需要让无数据的type空行显示空白size(如BB的最后一行),可添加以下代码 # result.loc[(result['type'] == '') & (result['size'] == 0), 'size'] = '' print(result.to_string(index=False))
输出结果
name type size AA TRUE 0 AA FALSE 21 AA 5 BB TRUE 4 BB FALSE 7 BB 0
如果要完全匹配你给出的期望输出(BB最后一行size为空),只需取消代码中最后一行注释即可。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

