在熊猫中满足条件后按组向前填充缺少的值

时间:2019-10-04 13:38:45

标签: python pandas group-by nan

我对此有点麻烦。我的数据框如下所示:

id    amount    dummy
1      130        0
1      120        0
1      110        1
1      nan       nan 
1      nan       nan   
2      nan        0
2      50         0
2      20         1
2      nan       nan 
2      nan       nan  

所以,我需要做的是,在假人获得value = 1之后,我需要为每个id用0填充数量变量,就像这样:

id    amount    dummy
1      130        0
1      120        0
1      110        1
1       0        nan 
1       0        nan   
2      nan        0
2      50         0
2      20         1
2       0        nan 
2       0        nan 

我猜我需要groupby('id')fillna(method='ffill')的某种组合,也许是.locshift(),但是我尝试的所有内容都出现了问题或非常慢有什么建议吗?

4 个答案:

答案 0 :(得分:6)

我将使用的方式

s = df.groupby('id')['dummy'].ffill().eq(1)
df.loc[s&df.dummy.isna(),'amount']=0

答案 1 :(得分:2)

您可以更轻松地做到这一点:

data[data['dummy'].isna()]['amount'] = 0

这将选择其中dummy为nan的所有行,并在数量列中填充0。

答案 2 :(得分:1)

IIUC,ffill()并掩盖静止状态:

s = df.groupby('id')['amount'].ffill().notnull()
df.loc[df['amount'].isna() & s, 'amount'] = 0

输出:

   id  amount  dummy
0   1   130.0    0.0
1   1   120.0    0.0
2   1   110.0    1.0
3   1     0.0    NaN
4   1     0.0    NaN
5   2     NaN    0.0
6   2    50.0    0.0
7   2    20.0    1.0
8   2     0.0    NaN
9   2     0.0    NaN

答案 3 :(得分:1)

请您尝试以下。

df.loc[df['dummy'].isnull(),'amount']=0
df

输出如下。

    id  amount  dummy
0   1   130.0   0.0
1   1   120.0   0.0
2   1   110.0   1.0
3   1   0.0     NaN
4   1   0.0     NaN
5   2   NaN     0.0
6   2   50.0    0.0
7   2   20.0    1.0
8   2   0.0     NaN
9   2   0.0     NaN