【问题标题】:Forward fill on custom value in pandas dataframe前向填充熊猫数据框中的自定义值
【发布时间】:2020-06-25 08:54:12
【问题描述】:

我希望对某些数据框列执行前向填充。 ffill 方法将缺失值或 NaN 替换为先前填充的值。 就我而言,我想执行前向填充,不同之处在于我不想在 Nan 上执行此操作,而是针对特定值(例如“*”)。

这是一个例子

import pandas as pd 
import numpy as np

d = [{"a":1, "b":10},
     {"a":2, "b":"*"},
     {"a":3, "b":"*"},
     {"a":4, "b":"*"},
     {"a":np.nan, "b":50},
     {"a":6, "b":60},
     {"a":7, "b":70}]

df = pd.DataFrame(d)

df 存在

     a   b
0  1.0  10
1  2.0   *
2  3.0   *
3  4.0   *
4  NaN  50
5  6.0  60
6  7.0  70

预期的结果应该是

     a   b
0  1.0  10
1  2.0  10
2  3.0  10
3  4.0  10
4  NaN  50
5  6.0  60
6  7.0  70

如果将“*”替换为np.nan 然后ffill,这将导致将ffill 应用于列a

由于我的数据有数百列,我想知道是否有比遍历所有列更有效的方法,检查它是否包含“*”,然后替换和填充。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将df.maskdf.isindf.replace 一起使用

    df.mask(df.isin(['*']),df.replace('*',np.nan).ffill())
    
         a   b
    0  1.0  10
    1  2.0  10
    2  3.0  10
    3  4.0  10
    4  NaN  50
    5  6.0  60
    6  7.0  70
    

    【讨论】:

      【解决方案2】:

      我认为您的方向是正确的,但这里有一个完整的解决方案。我正在做的是“标记”原始 NaN 值,然后使用 ffill 将“*”替换为 NaN,然后​​将原始 NaN 值放回原处。

      df = df.replace(np.NaN, "<special>").replace("*", np.NaN).ffill().replace("<special>", np.NaN)
      

      输出:

           a     b
      0  1.0  10.0
      1  2.0  10.0
      2  3.0  10.0
      3  4.0  10.0
      4  NaN  50.0
      5  6.0  60.0
      6  7.0  70.0
      

      这是一个替代解决方案,它做同样的事情,没有“特殊”标记:

      original_nan = df.isna()
      df = df.replace("*", np.NaN).ffill()
      df[original_nan] = np.NaN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-08
        • 2019-03-14
        • 2019-06-05
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        相关资源
        最近更新 更多