基于列条件在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:
- 保留"No Data"行,按日期和Category分组求和
- 排除"No Data"行,按日期和Category分组求和
你的代码错误分析
- 变量未定义:代码中
df2未定义,length = len(df2)无意义 - 语法错误:
range length缺少括号,正确应为range(length) - 逻辑错误:
if df1 ['Category'] = "A"是赋值操作而非比较,应改为==;且df1['Category'] == "A"返回布尔Series,不能直接用于if条件,这就是触发ValueError: The truth value of a Series is ambiguous的核心原因 - 逻辑偏差:整体代码未贴合分组求和需求,无需手动遍历,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
相关产品推荐
相关产品推荐

