Pandas的cumsum()能否将NaN视为0或直接忽略NaN计算累积和?
Pandas DataFrame 累积和处理NaN的两种实现方案
一、将NaN视为0计算累积和
直接对目标列的NaN值填充为0后,调用cumsum()即可,无需额外参数调整:
import pandas as pd import numpy as np # 示例DataFrame df = pd.DataFrame({'target_col': [3, np.nan, 4, np.nan, 2]}) # 将NaN当作0计算累积和 df['cumsum_with_nan_as_0'] = df['target_col'].fillna(0).cumsum()
生成的结果中,原NaN位置的累积和会延续加上0后的数值,示例结果如下:
| target_col | cumsum_with_nan_as_0 | |
|---|---|---|
| 0 | 3.0 | 3.0 |
| 1 | NaN | 3.0 |
| 2 | 4.0 | 7.0 |
| 3 | NaN | 7.0 |
| 4 | 2.0 | 9.0 |
二、忽略NaN直接计算累积和(不预先填充0)
这里的“忽略NaN”分两种场景:
场景1:仅计算时跳过NaN,结果保留原NaN位置的空值
Pandas的cumsum()默认参数skipna=True就是实现该需求的——计算累积和时会跳过NaN值,但原NaN对应的结果位置仍为NaN,后续非NaN值会继续基于之前的有效累积值计算:
# 保留结果中的NaN,仅计算时忽略NaN df['cumsum_ignore_nan_keep_null'] = df['target_col'].cumsum()
示例结果:
| target_col | cumsum_ignore_nan_keep_null | |
|---|---|---|
| 0 | 3.0 | 3.0 |
| 1 | NaN | NaN |
| 2 | 4.0 | 7.0 |
| 3 | NaN | NaN |
| 4 | 2.0 | 9.0 |
场景2:计算时跳过NaN,结果延续累积值(不保留空值)
如果希望结果中没有NaN,而是让原NaN位置延续前面的累积和,可以先调用默认的cumsum(),再用ffill()填充结果中的空值:
# 忽略NaN且结果无空值,延续累积和 df['cumsum_ignore_nan_fill'] = df['target_col'].cumsum().ffill()
示例结果:
| target_col | cumsum_ignore_nan_fill | |
|---|---|---|
| 0 | 3.0 | 3.0 |
| 1 | NaN | 3.0 |
| 2 | 4.0 | 7.0 |
| 3 | NaN | 7.0 |
| 4 | 2.0 | 9.0 |
内容的提问来源于stack exchange,提问作者h8n2
相关产品推荐
相关产品推荐

