Skip to main content
 首页 » 编程设计

python之Pandas 用 np.nan 替换前几个 0

2025年05月04日11unruledboy

我正在尝试用 np.nan 为每一列替换 DataFrame 的第一个连续的 0。例如,我要转换:

pd_tmp_start = pd.DataFrame([[0,0],[0,0.3],[1.2,0.4],[0,0]]) 
print pd_tmp_start 
 
     0    1 
0  0.0  0.0 
1  0.0  0.3 
2  1.2  0.4 
3  0.0  0.0 

到

pd_tmp_target = pd.DataFrame([[np.nan,np.nan],[np.nan,0.3],[1.2,0.4],[0,0]]) 
print pd_tmp_target 
 
     0    1 
0  NaN  NaN 
1  NaN  0.3 
2  1.2  0.4 
3  0.0  0.0 

所以,我要做的是

pd_tmp_start[pd_tmp_start.cumsum()==0] = np.nan 

虽然它有效。但是,我收到了警告

/home/myname/anaconda2/lib/python2.7/site-packages/ipykernel/main.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead

知道这样做的正确方法是什么吗?谢谢。

编辑:由于某种原因,前面的代码没有输出警告,但是当我处理复杂的 Dataframe 并执行 pd_tmp_start[pd_tmp_start().cumsum()==0] = np.nan

弹出警告....

请您参考如下方法:

让我们使用cumprod 和mask:

pd_tmp_start.mask(pd_tmp_start.eq(0).cumprod().astype(bool)) 

输出:

    0    1 
0  NaN  NaN 
1  NaN  0.3 
2  1.2  0.4 
3  0.0  0.0 

更新以下评论:

pd_tmp_start.mask(pd_tmp_start.eq(0).cumprod().astype(bool),-9876) 

输出:

        0       1 
0 -9876.0 -9876.0 
1 -9876.0     0.3 
2     1.2     0.4 
3     0.0     0.0