每组第一次观察后用0填充

2024-06-11 02:50:06 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:

是否有一种方法可以使用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

Tags: 方法idnangroupbydvpqxidoqpstkqnopiq
1条回答
网友
1楼 · 发布于 2024-06-11 02:50:06

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,然后检查新创建的数据帧,查看所有非NaN值和NaN值在原始df中的位置,并使用mask用0填充这些值

相关问题 更多 >