【问题标题】:Vectorized way of using the previous row value based on the condition基于条件使用上一行值的向量化方式
【发布时间】:2019-11-07 16:23:55
【问题描述】:

我有一个如下的熊猫数据框。我想执行以下条件: 如果列 'A' 为 1,则使用先前的值 'F' 更新列 'F' 的值。这可以逐行迭代完成,但这不是有效的方法。我想要一个矢量化的方法来做到这一点。

df = pd.DataFrame({'A':[1,1,1, 0, 0, 0, 1, 0, 0], 'C':[1,1,1, 0, 0, 0, 1, 1, 1], 'D':[1,1,1, 0, 0, 0, 1, 1, 1],
'F':[2,0,0, 0, 0, 1, 1, 1, 1]})
df

    A   C   D   F
0   1   1   1   2
1   1   1   1   0
2   1   1   1   0
3   0   0   0   0
4   0   0   0   0
5   0   0   0   1
6   1   1   1   1
7   0   1   1   1
8   0   1   1   1

我想要的输出:

    A   C   D   F
0   1   1   1   2
1   1   1   1   2
2   1   1   1   2
3   0   0   0   0
4   0   0   0   0
5   0   0   0   1
6   1   1   1   1
7   0   1   1   1
8   0   1   1   1

我尝试了下面的代码,但它不起作用,因为当我使用 shift 时,它不会占用更新的上一行。

df['F'] = df.groupby(['A'])['F'].shift(1)
df

    A   C   D   F
0   1   1   1   NaN
1   1   1   1   2.0
2   1   1   1   0.0
3   0   0   0   NaN
4   0   0   0   0.0
5   0   0   0   0.0
6   1   1   1   0.0
7   0   1   1   1.0
8   0   1   1   1.0

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    transform('first')

    df.F.groupby(df.A.rsub(1).cumsum()).transform('first')
    
    0    2
    1    2
    2    2
    3    0
    4    0
    5    1
    6    1
    7    1
    8    1
    Name: F, dtype: int64
    

    分配给列'F'

    df.assign(F=df.F.groupby(df.A.rsub(1).cumsum()).transform('first'))
    
       A  C  D  F
    0  1  1  1  2
    1  1  1  1  2
    2  1  1  1  2
    3  0  0  0  0
    4  0  0  0  0
    5  0  0  0  1
    6  1  1  1  1
    7  0  1  1  1
    8  0  1  1  1
    

    【讨论】:

      【解决方案2】:

      我们也知道如何在没有 groupby 的情况下做到这一点:

      where=df['A'].eq(1)&df['A'].ne(df['A'].shift())
      df['F']=df['F'].where(where).ffill().mask(df['A'].ne(1),df['F'])
      print(df)
      
         A  C  D    F
      0  1  1  1  2.0
      1  1  1  1  2.0
      2  1  1  1  2.0
      3  0  0  0  0.0
      4  0  0  0  0.0
      5  0  0  0  1.0
      6  1  1  1  1.0
      7  0  1  1  1.0
      8  0  1  1  1.0
      

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多