我希望对某些数据框列执行正向填充。
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
。
由于我的数据有数百列,所以我想知道是否有比循环遍历所有列更有效的方法,请检查它是否包含“ *”,然后替换并填充。
答案 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.mask
与df.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