如何将同ID下的null值替换为对应非空value值?
需求说明
我们有多条ID相同的数据,其中部分数据的value字段有值,部分为null,需要将null位置填充为对应ID的有效值。
当前数据
| id | value |
|---|---|
| 1 | null |
| 1 | null |
| 1 | null |
| 1 | ABC |
| 1 | null |
预期结果
| id | value |
|---|---|
| 1 | ABC |
| 1 | ABC |
| 1 | ABC |
| 1 | ABC |
| 1 | ABC |
解决方案
1. SQL实现(以MySQL为例)
利用窗口函数获取每个ID的有效值,替换null:
SELECT id, COALESCE(value, MAX(value) OVER(PARTITION BY id)) AS value FROM your_table;
针对不支持窗口函数的旧版SQL,可通过子查询关联实现:
SELECT t1.id, COALESCE(t1.value, t2.valid_value) AS value FROM your_table t1 JOIN ( SELECT id, MAX(value) AS valid_value FROM your_table WHERE value IS NOT NULL GROUP BY id ) t2 ON t1.id = t2.id;
2. Python Pandas实现
通过分组转换填充null:
import pandas as pd df = pd.DataFrame({ 'id': [1,1,1,1,1], 'value': [None, None, None, 'ABC', None] }) # 用分组内第一个非空值填充null df['value'] = df.groupby('id')['value'].transform(lambda x: x.fillna(x.dropna().iloc[0])) print(df)
3. Python原生实现
先构建ID与有效值的映射,再遍历填充:
data = [ {'id':1, 'value':None}, {'id':1, 'value':None}, {'id':1, 'value':None}, {'id':1, 'value':'ABC'}, {'id':1, 'value':None} ] # 收集每个ID对应的有效值 id_value_map = {} for item in data: if item['value'] is not None: id_value_map[item['id']] = item['value'] # 替换null值 for item in data: if item['value'] is None: item['value'] = id_value_map.get(item['id']) print(data)
内容的提问来源于stack exchange,提问作者Ishwar
相关产品推荐
相关产品推荐

