在 pandas 中满足条件后按组向前填充缺失值
Forward fill missing values by group after condition is met in pandas
我在这方面遇到了一些麻烦。我的数据框如下所示:
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
所以,我需要做的是,在 dummy 获得 value = 1 之后,我需要为每个 id
用零填充 amount 变量,如下所示:
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')
的某种组合,可能是 .loc
或 shift()
,但我尝试的所有方法都有一些问题还是很慢。有什么建议吗?
IIUC,ffill()
并屏蔽 still-nan:
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
你可以更轻松地做到这一点:
data[data['dummy'].isna()]['amount'] = 0
这将 select 虚拟为 nan 的所有行,并用 0 填充金额列。
我将使用的方式
s = df.groupby('id')['dummy'].ffill().eq(1)
df.loc[s&df.dummy.isna(),'amount']=0
能否请您尝试以下。
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
我在这方面遇到了一些麻烦。我的数据框如下所示:
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
所以,我需要做的是,在 dummy 获得 value = 1 之后,我需要为每个 id
用零填充 amount 变量,如下所示:
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')
的某种组合,可能是 .loc
或 shift()
,但我尝试的所有方法都有一些问题还是很慢。有什么建议吗?
IIUC,ffill()
并屏蔽 still-nan:
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
你可以更轻松地做到这一点:
data[data['dummy'].isna()]['amount'] = 0
这将 select 虚拟为 nan 的所有行,并用 0 填充金额列。
我将使用的方式
s = df.groupby('id')['dummy'].ffill().eq(1)
df.loc[s&df.dummy.isna(),'amount']=0
能否请您尝试以下。
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