pandas用np.nan替换了前几个0

时间:2017-11-01 16:17:51

标签: python pandas

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

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/的的.py:1:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

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

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

警告弹出......

3 个答案:

答案 0 :(得分:3)

您可以使用DataFrame.mask()方法:

-rw-r--r--. 1 user mygroup   5295 Nov  1 13:21 report.sty
-rw-r--r--. 1 user mygroup   7187 Nov  1 15:53 review.aux
-rw-r--r--. 1 user mygroup  26716 Nov  1 15:53 review.bbl
-rw-r--r--. 1 user mygroup  96804 Nov  1 15:53 review.bcf
lrwxrwxrwx. 1 user mygroup     52 Nov  1 15:57 review.bib -> ../../../../papers/libraries/zoterobibtex/review.bib
-rw-r--r--. 1 user mygroup   1068 Nov  1 15:53 review.blg
-rw-r--r--. 1 user mygroup  50626 Nov  1 15:53 review.log
-rw-r--r--. 1 user mygroup    821 Nov  1 15:53 review.out
-rw-r--r--. 1 user mygroup 360265 Nov  1 15:53 review.pdf
-rw-r--r--. 1 user mygroup   2315 Nov  1 15:53 review.run.xml
-rw-r--r--. 1 user mygroup   1472 Nov  1 13:21 review.tex

答案 1 :(得分:3)

()

之后您不需要pd_tmp_start
pd_tmp_start[(pd_tmp_start.cumsum()==0)]=np.nan
pd_tmp_start
Out[604]: 
     0    1
0  NaN  NaN
1  NaN  0.3
2  1.2  0.4
3  0.0  0.0

答案 2 :(得分:3)

让我们使用cumprodmask

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