如何修改Pandas聚合代码以合并连续NaN值为同一区间?
解决连续NaN分组问题的修改方案
原代码无法合并连续NaN的核心原因是:Pandas中NaN与任何值(包括自身)的比较结果都是False,且shift().bfill()的填充逻辑会破坏连续NaN的连续性判断。我们需要调整分组键的生成逻辑,将连续NaN视为相同值进行分组。
修改后的完整代码如下:
# 生成正确的分组键:连续相同值(包括连续NaN)归为同一组 same_as_prev = A["1or0"].eq(A["1or0"].shift()) | (A["1or0"].isna() & A["1or0"].shift().isna()) ser = (~same_as_prev).cumsum() B = ( A.groupby(ser, as_index=False) .agg({"Index": ["first", "last", "count"], "1or0": "unique"}) .set_axis(["StartNum", "EndNum", "Size", "Value"], axis=1) .assign(Value= lambda d: d["Value"].astype(str).str.strip("[]")) )
关键修改说明:
- 分组键逻辑调整:
same_as_prev序列标记当前行值是否与前一行值相同:A["1or0"].eq(A["1or0"].shift()):判断非NaN值是否与前一行相等(A["1or0"].isna() & A["1or0"].shift().isna()):额外判断当前行和前一行是否均为NaN,将连续NaN视为相同值
(~same_as_prev).cumsum():当当前行与前一行不同时,分组号递增,确保连续相同值(包括NaN)归为同一组
- 后续处理兼容:原代码的
agg和assign逻辑无需修改,连续NaN分组后的unique()会返回[nan],经astype(str).str.strip("[]")处理后会显示为nan,符合需求
内容的提问来源于stack exchange,提问作者Natoshi SakiSaki
相关产品推荐
相关产品推荐

