按Code分组实现列数值条件替换的技术求助
数据分组处理方案
需求说明
原始数据
ID Value1 Value2 Code 0001 3.3 432 A 0001 0 654 A 0001 0 63 A 0002 0 78 B 0002 1 98 B 0003 0 22 C 0003 0 65 C 0003 0 91 C
目标结果
ID Value1 Value2 Code 0001 3.3 432 A 0001 0 0 A 0001 0 0 A 0002 0 0 B 0002 1 98 B 0003 0 22 C 0003 0 65 C 0003 0 91 C
处理规则
- 按
Code字段分组 - 若组内存在至少一行
Value1≠0:将该组内所有Value1=0的行的Value2设为0 - 若组内所有行
Value1均为0:保持原数据不变
实现方案
Python Pandas 方法
import pandas as pd # 构造原始数据(实际场景可通过read_csv等方法读取) df = pd.DataFrame({ 'ID': ['0001', '0001', '0001', '0002', '0002', '0003', '0003', '0003'], 'Value1': [3.3, 0, 0, 0, 1, 0, 0, 0], 'Value2': [432, 654, 63, 78, 98, 22, 65, 91], 'Code': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'] }) # 标记每组是否存在非0的Value1 df['has_non_zero'] = df.groupby('Code')['Value1'].transform(lambda x: (x != 0).any()) # 应用规则修改Value2 df['Value2'] = df.apply( lambda row: 0 if row['has_non_zero'] and row['Value1'] == 0 else row['Value2'], axis=1 ) # 移除辅助列 df = df.drop(columns='has_non_zero') # 输出结果 print(df)
SQL 方法(以MySQL为例)
-- 先标记每组是否存在非0的Value1 WITH group_status AS ( SELECT Code, MAX(CASE WHEN Value1 != 0 THEN 1 ELSE 0 END) AS has_non_zero FROM your_table GROUP BY Code ) -- 更新符合条件的行 UPDATE your_table t JOIN group_status gs ON t.Code = gs.Code SET t.Value2 = 0 WHERE gs.has_non_zero = 1 AND t.Value1 = 0; -- 查询处理后的数据 SELECT * FROM your_table;
内容的提问来源于stack exchange,提问作者NewUsr
相关产品推荐
相关产品推荐

