用前一个非零值替换零值

3

我有一个数据框中的指示变量,它取值为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

我希望得到一个类似下面这样的数据框:

enter image description here

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]})

enter image description here

2个回答

3

使用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

另一个选项是使用groupbytransform,使用由cumsum形成的分组器:
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

@Wen-Ben 谢谢你的回答 :) - cs95
你是最棒的! - rer49

2
使用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

您也是。很棒的技能。 - rer49
1
@rer49,我的朋友,最好给两个答案点赞并接受Cold的答案,因为他的答案更优雅。 - BENY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接