【问题标题】:Fetch first non-zero value in previous rows in pandas在熊猫的前几行中获取第一个非零值
【发布时间】:2019-03-11 02:44:34
【问题描述】:

以下是我的数据框的样子。 Expected_Output 是我想要的专栏:

   Group  Signal  Ready  Value  Expected_Output
0      1       0      0      3              NaN
1      1       0      1     72              NaN
2      1       0      0      0              NaN
3      1       4      0      0             72.0
4      1       4      0      0             72.0
5      1       4      0      0             72.0
6      2       0      0      0              NaN
7      2       7      0      0              NaN
8      2       7      0      0              NaN
9      2       7      0      0              NaN

如果Signal > 1,那么我试图在Group 中的前几行中获取最新的非零Value,其中Ready = 1。所以在第 3 行,Signal = 4,所以我想从第 1 行获取最新的非零 Value of 72,其中 Ready = 1

一旦我可以获取该值,我就可以执行df.groupby(['Group','Signal']).Value.transform('first'),因为信号会像 444 一样重复出现,但不确定如何获取 Value

【问题讨论】:

    标签: python pandas numpy pandas-groupby series


    【解决方案1】:

    IIUC groupby + ffill 带布尔赋值

    df['Help']=df.Value.where(df.Ready==1).replace(0,np.nan)
    
    df['New']=df.groupby('Group').Help.ffill()[df.Signal>1]
    df
    Out[1006]: 
       Group  Signal  Ready  Value  Expected_Output  Help   New
    0      1       0      0      3              NaN   3.0   NaN
    1      1       0      1     72              NaN  72.0   NaN
    2      1       0      0      0              NaN   NaN   NaN
    3      1       4      0      0             72.0   NaN  72.0
    4      1       4      0      0             72.0   NaN  72.0
    5      1       4      0      0             72.0   NaN  72.0
    6      2       0      0      0              NaN   NaN   NaN
    7      2       7      0      0              NaN   NaN   NaN
    8      2       7      0      0              NaN   NaN   NaN
    9      2       7      0      0              NaN   NaN   NaN
    

    【讨论】:

    • @jpp 添加 :-) .
    【解决方案2】:

    通过GroupBy + ffill 创建一个系列,然后屏蔽结果系列:

    s = df.assign(Value_mask=df['Value'].where(df['Ready'].eq(1)))\
          .groupby('Group')['Value_mask'].ffill()
    
    df['Value'] = s.where(df['Signal'].gt(1))
    
       Group  Signal  Ready  Value
    0      1       0      0    NaN
    1      1       0      1    NaN
    2      1       0      0    NaN
    3      1       4      0   72.0
    4      1       4      0   72.0
    5      1       4      0   72.0
    6      2       0      0    NaN
    7      2       7      0    NaN
    8      2       7      0    NaN
    9      2       7      0    NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-07
      • 2016-01-20
      • 1970-01-01
      • 2021-05-01
      • 2017-03-27
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多