【问题标题】:Python (pandas): replace value if previous value is same as next valuePython(熊猫):如果前一个值与下一个值相同,则替换值
【发布时间】:2018-01-04 10:42:42
【问题描述】:

我有以下问题:

我有一个可能多达 600 万行的数据框。此数据框中的一列包含某些 ID。

ID
NaN
NaN
D1
D1
D1
NaN
D1
D1
NaN
NaN
NaN
NaN
D2
NaN
D2
NaN
NaN
NaN
NaN
D3
NaN
D3
NaN
D3
NaN
NaN

我想让 ID 之间包含的 NaN 与 ID 相同。因此上面的df应该变成:

ID
NaN
NaN
D1
D1
D1
D1
D1
D1
NaN
NaN
NaN
NaN
D2
D2
D2
NaN
NaN
NaN
NaN
D3
D3
D3
D3
D3
NaN
NaN

有人知道如何以快速、节省内存的方式做到这一点吗? 提前致谢。

【问题讨论】:

    标签: python pandas outliers


    【解决方案1】:

    使用shiftloc。使用shift(1)shift(-1) 比较上一个和下一个值

    In [219]: df.loc[df.ID.shift(-1) == df.ID.shift(1), 'ID'] = df.ID.shift(1)
    
    In [220]: df
    Out[220]:
         ID
    0   NaN
    1   NaN
    2    D1
    3    D1
    4    D1
    5    D1
    6    D1
    7    D1
    8   NaN
    9   NaN
    10  NaN
    11  NaN
    12   D2
    13   D2
    14   D2
    15  NaN
    16  NaN
    17  NaN
    18  NaN
    19   D3
    20   D3
    21   D3
    22   D3
    23   D3
    24  NaN
    25  NaN
    

    【讨论】:

      【解决方案2】:

      您可以使用ffillbfill - 如果gap 大于1,它也可以:

      f = df['ID'].ffill()
      df['a'] = df['ID'].mask(f.eq(df['ID'].bfill()), f)
      print (df)
      
           ID    a
      0   NaN  NaN
      1   NaN  NaN
      2    D1   D1
      3    D1   D1
      4    D1   D1
      5   NaN   D1
      6    D1   D1
      7    D1   D1
      8   NaN  NaN
      9   NaN  NaN
      10  NaN  NaN
      11  NaN  NaN
      12   D2   D2
      13  NaN   D2
      14   D2   D2
      15  NaN  NaN
      16  NaN  NaN
      17  NaN  NaN
      18  NaN  NaN
      19   D3   D3
      20  NaN   D3
      21   D3   D3
      22  NaN   D3
      23   D3   D3
      24  NaN  NaN
      25  NaN  NaN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 2017-08-15
        • 2014-04-01
        • 2017-11-01
        • 2018-11-04
        • 2020-05-09
        • 2017-11-30
        相关资源
        最近更新 更多