Power Query技术需求:Name and address字段为null时重置索引并设为0
自定义索引实现方案
需求回顾
当Name and address字段为null时,对应Index设为0;非null的连续行按顺序从1开始计数,遇到null后,下一组非null行重新从1开始计数。
Pandas 实现代码
import pandas as pd # 模拟数据集(替换为你的实际数据) df = pd.DataFrame({ "Name and address": ["aasdfnkjdf", "aasdfnkjdf", "aasdfnkjdf", None, None, "aasdfnkjdf", "aasdfnkjdf", None, None, None, "aasdfnkjdf", "aasdfnkjdf", None, "aasdfnkjdf", "aasdfnkjdf"] }) # 生成分组标识:每遇到null,分组ID递增 df['group_id'] = df['Name and address'].isnull().cumsum() # 对每个分组内的非null行计数,null行直接设为0 df['Index'] = df.groupby('group_id').cumcount() + 1 df.loc[df['Name and address'].isnull(), 'Index'] = 0 # 清理临时列(可选) df = df.drop('group_id', axis=1) print(df)
代码说明:
isnull().cumsum():通过累加null的出现次数,为连续的非null行分配相同的分组ID,遇到null后分组ID自动递增,实现计数重置。groupby('group_id').cumcount() +1:对每个分组内的行从1开始顺序计数。- 最后通过
loc将所有null行的Index值改为0。
SQL 实现代码(以MySQL为例)
假设你的数据表名为your_table,且存在用于排序的主键id:
SELECT `Name and address`, CASE WHEN `Name and address` IS NULL THEN 0 ELSE ROW_NUMBER() OVER (PARTITION BY grp ORDER BY id) END AS `Index` FROM ( SELECT *, SUM(CASE WHEN `Name and address` IS NULL THEN 1 ELSE 0 END) OVER (ORDER BY id) AS grp FROM your_table ) t;
代码说明:
- 子查询中用窗口函数
SUM() OVER (ORDER BY id)累加null的出现次数,生成分组标识grp。 - 主查询中用
ROW_NUMBER()对每个grp内的非null行排序计数,null行直接返回0。
内容的提问来源于stack exchange,提问作者ValkyrieRaevyn
相关产品推荐
相关产品推荐

