Pandas中多数据类型列求和:分组聚合处理非数值数据
Pandas实现方案:按指定字段分组并求和有效数值
需求说明
现有原始数据集:
Name Location code ID Details Column5 Code Kirsh HD12 76 Age:25 127.3 Yes Kirsh HD12 76 Age:25 12758.56 Yes Kirsh HD12 76 Age:25 No data found No John HD12 87 Age:25; 76.45 Yes John HD12 87 Age:25; No data found No John HD12 87 Age:25; No John HD12 87 Age:25; 16578.56 Yes Ward HD12 87 Age:25; No Ward HD12 87 Age:25; No
需按Name、Location code、ID、Details字段分组,对Column5中的有效数值求和(忽略非数值内容、缺失值),最终得到目标结果:
Name Location code ID Details Column5 Code Kirsh HD12 76 Age:25 12885.86 Yes John HD12 87 Age:25; 16655.01 No Ward HD12 87 Age:25; No
注:目标中Kirsh的Column5数值应为127.3+12758.56=12885.86,推测原始需求存在笔误,以下代码按正确求和逻辑实现
实现代码
import pandas as pd # 构造原始数据集 raw_data = { 'Name': ['Kirsh', 'Kirsh', 'Kirsh', 'John', 'John', 'John', 'John', 'Ward', 'Ward'], 'Location code': ['HD12'] * 9, 'ID': [76, 76, 76, 87, 87, 87, 87, 87, 87], 'Details': ['Age:25']*3 + ['Age:25;']*6, 'Column5': ['127.3', '12758.56', 'No data found', '76.45', 'No data found', '', '16578.56', '', ''], 'Code': ['Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'Yes', 'No', 'No'] } df = pd.DataFrame(raw_data) # 清洗Column5:将非数值内容转为NaN,求和时自动忽略 df['Column5'] = pd.to_numeric(df['Column5'], errors='coerce') # 定义分组聚合逻辑 def process_group(group): # 计算有效数值求和 col5_sum = group['Column5'].sum() # 处理Code字段:匹配目标规则,求和非空且存在Yes则取Yes,否则取No code_val = 'Yes' if (not pd.isna(col5_sum)) and ('Yes' in group['Code'].values) else 'No' # 格式化求和结果,空值转为空字符串 formatted_sum = round(col5_sum, 2) if not pd.isna(col5_sum) else '' return pd.Series({'Column5': formatted_sum, 'Code': code_val}) # 执行分组聚合 result_df = df.groupby(['Name', 'Location code', 'ID', 'Details'], as_index=False).apply(process_group) # 输出结果 print(result_df.to_string(index=False))
关键逻辑说明
- 数值清洗:用
pd.to_numeric将Column5中的非数值内容转为NaN,Pandas求和时会自动忽略NaN值 - 分组聚合:按指定字段分组后,自定义聚合函数处理求和与
Code字段的取值逻辑 - 结果格式化:将求和结果保留两位小数,无有效数值时显示为空字符串
内容的提问来源于stack exchange,提问作者Eswar
相关产品推荐
相关产品推荐

