第一次观察后每组0分



问题

有没有一种方法可以使用groupby用0填充缺失的值,但只能在第一次出现观测值之后?

例如启动

id   spiq  nopiq   spiq  pstkq  dvy  dvpq  mibq  xidoq   miiq
2014    1   NaN   NaN     NaN   0.0   NaN   0.0   0.0 -0.122  0.000
2015    1   0.01  0.003   0.1   0.10  NaN   NaN   NaN -1.309  0.000
2016    1   0.04  0.003   NaN   0.10  NaN   0.10  0.10  NaN   NaN
2017    1   NaN   0.000   NaN   NaN   20    NaN   NaN  0.000  NaN
2018    1   0.05  0.000   NaN   0.0   NaN   0.0   0.0  0.000  0.000
2014    2   NaN   NaN     NaN   0.0   NaN   0.0   0.0 -0.122  0.000
2015    2   0.01  0.003   0.1   0.10  NaN   NaN   NaN -1.309  0.000
2016    2   0.04  0.003   NaN   0.10  NaN   0.10  0.10  NaN   NaN
2017    2   NaN   0.000   NaN   NaN   20    NaN   NaN  0.000  NaN
2018    2   0.05  0.000   NaN   0.0   NaN   0.0   0.0  0.000  0.000
2014    3   NaN   NaN     NaN   0.0   NaN   0.0   0.0 -0.122  0.000
2015    3   0.01  0.003   0.1   0.10  NaN   NaN   NaN -1.309  0.000
2016    3   0.04  0.003   NaN   0.10  NaN   0.10  0.10  NaN   NaN
2017    3   NaN   0.000   NaN   NaN   20    NaN   NaN  0.000  NaN
2018    3   0.05  0.000   NaN   0.0   NaN   0.0   0.0  0.000  0.000

所需

id   spiq  nopiq   spiq  pstkq  dvy  dvpq  mibq  xidoq   miiq
2014    1   NaN   NaN     NaN   0.0   NaN   0.0   0.0  -0.122  0.000
2015    1   0.01  0.003   0.1   0.10  NaN   0.0   0.0  -1.309  0.000
2016    1   0.04  0.003   0.0   0.10  NaN   0.10  0.10  0.0    0.0
2017    1   0.0   0.000   0.0   0.0   20    0.0   0.0   0.0    0.0
2018    1   0.05  0.000   0.0   0.0   0.0   0.0   0.0   0.0    0.000
2014    2   NaN   NaN     NaN   0.0   NaN   0.0   0.0  -0.122  0.000
2015    2   0.01  0.003   0.1   0.10  NaN   0.0   0.0  -1.309  0.000
2016    2   0.04  0.003   0.0   0.10  NaN   0.10  0.10  0.0    0.0
2017    2   0.0   0.000   0.0   0.0   20    0.0   0.0   0.000  0.0
2018    2   0.05  0.000   0.0   0.0   0.0   0.0   0.0   0.000  0.000
2014    3   NaN   NaN     NaN   0.0   NaN   0.0   0.0  -0.122  0.000
2015    3   0.01  0.003   0.1   0.10  NaN   0.0   0.0  -1.309  0.000
2016    3   0.04  0.003   0.0   0.10  NaN   0.10  0.10  0.0    0.0
2017    3   0.0   0.000   0.0   0.0   20    0.0   0.0   0.000  0.0
2018    3   0.05  0.000   0.0   0.0   0.0   0.0   0.0   0.000  0.000

IIUC,这里有一种方法,因为你不能用零向前填充。

df.mask((df.groupby('id').ffill().notna() & 
df.isna()).fillna(False), 0)

输出:

id  spiq  nopiq  spiq.1  pstkq   dvy  dvpq  mibq  xidoq  miiq
2014   1   NaN    NaN     NaN    0.0   NaN   0.0   0.0 -0.122   0.0
2015   1  0.01  0.003     0.1    0.1   NaN   0.0   0.0 -1.309   0.0
2016   1  0.04  0.003     0.0    0.1   NaN   0.1   0.1  0.000   0.0
2017   1  0.00  0.000     0.0    0.0  20.0   0.0   0.0  0.000   0.0
2018   1  0.05  0.000     0.0    0.0   0.0   0.0   0.0  0.000   0.0
2014   2   NaN    NaN     NaN    0.0   NaN   0.0   0.0 -0.122   0.0
2015   2  0.01  0.003     0.1    0.1   NaN   0.0   0.0 -1.309   0.0
2016   2  0.04  0.003     0.0    0.1   NaN   0.1   0.1  0.000   0.0
2017   2  0.00  0.000     0.0    0.0  20.0   0.0   0.0  0.000   0.0
2018   2  0.05  0.000     0.0    0.0   0.0   0.0   0.0  0.000   0.0
2014   3   NaN    NaN     NaN    0.0   NaN   0.0   0.0 -0.122   0.0
2015   3  0.01  0.003     0.1    0.1   NaN   0.0   0.0 -1.309   0.0
2016   3  0.04  0.003     0.0    0.1   NaN   0.1   0.1  0.000   0.0
2017   3  0.00  0.000     0.0    0.0  20.0   0.0   0.0  0.000   0.0
2018   3  0.05  0.000     0.0    0.0   0.0   0.0   0.0  0.000   0.0

详细信息:

groupby之后使用ffill,用每个组的最后一个有效值填充NaN,然后检查新创建的数据帧,查看原始df中所有非NaN值和NaN值的位置,并使用mask用0填充这些值。

最新更新