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

基于列条件在Pandas中实现分组求和及数据过滤问题

DataFrame分组求和问题解决及错误修复

原始数据结构

Date                  Name          Category      #
01/01/01              Vegetables       A          15
01/01/01              Fruits           A          10
01/01/01              Meat             B          35
01/02/01              Vegetables       A           7
01/03/01              Vegetables       A           9
01/03/01              No Data         No Data    No Data

需求

生成两个目标DataFrame:

  1. 保留"No Data"行,按日期和Category分组求和
  2. 排除"No Data"行,按日期和Category分组求和

你的代码错误分析

  1. 变量未定义:代码中df2未定义,length = len(df2)无意义
  2. 语法错误:range length缺少括号,正确应为range(length)
  3. 逻辑错误:if df1 ['Category'] = "A"是赋值操作而非比较,应改为==;且df1['Category'] == "A"返回布尔Series,不能直接用于if条件,这就是触发ValueError: The truth value of a Series is ambiguous的核心原因
  4. 逻辑偏差:整体代码未贴合分组求和需求,无需手动遍历,pandas的groupby可直接完成分组聚合操作

正确解决方案

步骤1:构造/处理原始数据

先确保#列能正确求和,将非"No Data"的内容转为数值类型:

import pandas as pd

# 构造原始DataFrame(如果已有df1可跳过此步)
data = {
    'Date': ['01/01/01', '01/01/01', '01/01/01', '01/02/01', '01/03/01', '01/03/01'],
    'Name': ['Vegetables', 'Fruits', 'Meat', 'Vegetables', 'Vegetables', 'No Data'],
    'Category': ['A', 'A', 'B', 'A', 'A', 'No Data'],
    '#': ['15', '10', '35', '7', '9', 'No Data']
}
df1 = pd.DataFrame(data)

# 转换#列:非"No Data"转为整数,保留原字符串
df1['#'] = pd.to_numeric(df1['#'], errors='coerce').fillna(df1['#'])

步骤2:生成保留"No Data"的目标DataFrame

# 提取No Data行并重命名列
no_data_rows = df1[df1['Category'] == 'No Data'].rename(columns={'Category': 'Classification'})[['Date', 'Classification', '#']]

# 有效数据分组求和
valid_data = df1[df1['Category'] != 'No Data']
grouped_valid = valid_data.groupby(['Date', 'Category'])['#'].sum().reset_index()
grouped_valid = grouped_valid.rename(columns={'Category': 'Classification'})

# 合并并按日期排序
df_with_no_data = pd.concat([grouped_valid, no_data_rows]).sort_values('Date').reset_index(drop=True)
print(df_with_no_data)

输出结果:

Date Classification   #
0  01/01/01              A  25
1  01/01/01              B  35
2  01/02/01              A   7
3  01/03/01              A   9
4  01/03/01         No Data  No Data

步骤3:生成排除"No Data"的目标DataFrame

# 直接对有效数据分组求和
df_without_no_data = valid_data.groupby(['Date', 'Category'])['#'].sum().reset_index()
df_without_no_data = df_without_no_data.rename(columns={'Category': 'Classification'})
print(df_without_no_data)

输出结果:

Date Classification   #
0  01/01/01              A  25
1  01/01/01              B  35
2  01/02/01              A   7
3  01/03/01              A   9

内容的提问来源于stack exchange,提问作者kiwi_kimchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:06:22