You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按name列相似前缀分组并按type类别值求和?

实现按name前缀分组并结合type求和

核心思路

  1. 从name列提取前缀(如AA:3400提取为AA)
  2. 按前缀和type列分组,对size求和
  3. 补全每个前缀下所有可能的type类别(空值、TRUE、FALSE),缺失的求和值填0
  4. 调整行顺序匹配期望输出

完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:50:12