使用Pandas按冒号前唯一字符分组求和的问题求助
解决按Box列首段字符串分组求和的问题
问题描述
需要按Box列中第一个冒号前的唯一字符分组,对FALSE和TRUE列求和。现有数据:
Box FALSE TRUE DDD8:0Y:1C611:100 1 2 DDD8:0Y:1C711:107 2 1 DDD8:0Y:1C711:109 3 5 AAS0:1T:1F500A:001 1 4 AAS0:1T:1F500A:002 2 2 AAS0:1T:1F500A:005 0 3 AAS0:1T:1F500A:005 2 3
期望输出(注:期望输出中的AA20应为笔误,实际应为AAS0):
Box FALSE TRUE DDD8 6 8 AAS0 5 12
当前使用str.split(':')处理Box列后调用groupby('key').sum(),但输出标签未正确生成。
解决方案
问题出在未正确提取分组键或分组后未将索引转为列,以下是修正后的完整代码:
import pandas as pd # 构造DataFrame(实际场景可替换为读取数据的代码,如pd.read_csv) data = { 'Box': ['DDD8:0Y:1C611:100', 'DDD8:0Y:1C711:107', 'DDD8:0Y:1C711:109', 'AAS0:1T:1F500A:001', 'AAS0:1T:1F500A:002', 'AAS0:1T:1F500A:005', 'AAS0:1T:1F500A:005'], 'FALSE': [1, 2, 3, 1, 2, 0, 2], 'TRUE': [2, 1, 5, 4, 2, 3, 3] } df = pd.DataFrame(data) # 提取Box列第一个冒号前的字符串作为分组键 # 方法1:split后取第一个元素 df['Group'] = df['Box'].str.split(':').str[0] # 方法2:正则提取(处理大量数据时更高效) # df['Group'] = df['Box'].str.extract(r'^([^:]+)', expand=False) # 按分组键对FALSE、TRUE列求和,并重设索引将分组键转为列 result = df.groupby('Group')[['FALSE', 'TRUE']].sum().reset_index() # 重命名列名以匹配期望输出格式 result = result.rename(columns={'Group': 'Box'}) # 打印结果 print(result.to_string(index=False))
关键修正点
- 正确提取分组键:必须通过
str.split(':').str[0]或正则提取,确保拿到第一个冒号前的完整字符串,而不是整个split后的列表。 - 重置索引:
groupby默认会将分组键设为索引,调用reset_index()可以将其转为普通列,保证输出有Box标签。 - 列名重命名:将临时分组列
Group改回Box,匹配期望输出的列名。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

