【问题标题】:fill values after condition with NaN用 NaN 填充条件后的值
【发布时间】:2021-01-09 11:41:04
【问题描述】:

我有一个这样的 df:

df = pd.DataFrame(
    [
        ['A', 1],
        ['A', 1],
        ['A', 1],
        ['B', 2],
        ['B', 0],
        ['A', 0],
        ['A', 1],
        ['B', 1],
        ['B', 0]
    ], columns = ['key', 'val'])
df

打印:

    key val
0   A   1
1   A   1
2   A   1
3   B   2
4   B   0
5   A   0
6   A   1
7   B   1
8   B   0

我想填充 val 列中 2 之后的行(在示例中 val 列中从第 3 行到第 8 行的所有值都替换为 nan)。

我试过了:

df['val'] = np.where(df['val'].shift(-1) == 2, np.nan, df['val'])

并像这样遍历行:

for row in df.iterrows():
    df['val'] = np.where(df['val'].shift(-1) == 2, np.nan, df['val'])

但无法让它向前填充 nan。

【问题讨论】:

  • 如何编写熊猫问题的面包和黄油示例,做得好。

标签: python-3.x pandas numpy


【解决方案1】:

你可以试试:

ind = df.loc[df['val']==2].index
df.iloc[ind[0]:,1] = np.nan

【讨论】:

    【解决方案2】:

    一旦你得到df.index[df.val.shift(-1).eq(2)].item() 的索引,你就可以使用切片了

    idx = df.index[df.val.shift(-1).eq(2)].item()
    df.iloc[idx:, 1] = np.nan
    df
      key  val
    0   A  1.0
    1   A  1.0
    2   A  NaN
    3   B  NaN
    4   B  NaN
    5   A  NaN
    6   A  NaN
    7   B  NaN
    8   B  NaN
    

    【讨论】:

      【解决方案3】:

      您可以使用boolean indexingcummax 来填充nan 值:

      df.loc[df['val'].eq(2).cummax(), 'val'] = np.nan
      

      或者你也可以使用Series.mask:

      df['val'] = df['val'].mask(lambda x: x.eq(2).cummax())
      

        key  val
      0   A  1.0
      1   A  1.0
      2   A  1.0
      3   B  NaN
      4   B  NaN
      5   A  NaN
      6   A  NaN
      7   B  NaN
      8   B  NaN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        相关资源
        最近更新 更多