在熊猫数据框中向前填充自定义值

时间:2020-06-25 08:54:12

标签: python pandas

我希望对某些数据框列执行正向填充。 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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以将df.maskdf.isin结合使用df.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