繁体   English   中英

将零替换为先前的非零值

[英]Replace zero with the previous non-zero value

我的数据框中有一个指示符变量,它取值为1 0或-1。 我想创建一个避免0的新变量,而是重复指示变量的非零值,直到它变为1或-1。

我尝试使用np.where语句进行各种构造,但我无法解决这个问题。

这是原始数据帧:

import pandas as pd
df = pd.DataFrame(
{'Date': [1,2,3,4,5,6,7,8,9,10],
'Ind': [1,0,0,-1,0,0,0,1,0,0]})
df

在此输入图像描述

我希望得到一个如下所示的数据框:

df2 = pd.DataFrame(
{'Date': [1,2,3,4,5,6,7,8,9,10],
'Ind': [1,0,0,-1,0,0,0,1,0,0],
'NewVar':[1,1,1,-1,-1,-1,-1,1,1,1]})

在此输入图像描述

使用maskffill

df['Ind'].mask(df['Ind'] == 0).ffill()

0    1.0
1    1.0
2    1.0
3   -1.0
4   -1.0
5   -1.0
6   -1.0
7    1.0
8    1.0
9    1.0
Name: Ind, dtype: float64

df['Ind'].mask(df['Ind'] == 0).ffill(downcast='infer')

0    1
1    1
2    1
3   -1
4   -1
5   -1
6   -1
7    1
8    1
9    1
Name: Ind, dtype: int64

另一种选择是使用groupby并使用由cumsum形成的石斑transform

df.groupby(df['Ind'].ne(0).cumsum())['Ind'].transform('first')

0    1
1    1
2    1
3   -1
4   -1
5   -1
6   -1
7    1
8    1
9    1
Name: Ind, dtype: int64

使用reindex

df.Ind[df.Ind!=0].reindex(df.index,method='ffill')
0    1
1    1
2    1
3   -1
4   -1
5   -1
6   -1
7    1
8    1
9    1
Name: Ind, dtype: int64

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM