![](/img/trans.png)
[英]How to forward propagate/fill a specific value in a Pandas DataFrame Column/Series?
[英]Forward fill on custom value in pandas dataframe
我希望在一些 dataframe 列上執行前向填充。 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
。
由於我的數據有數百列,我想知道是否有比遍歷所有列更有效的方法,檢查它是否包含“*”,然后替換和填充。
我認為您正朝着正確的方向前進,但這是一個完整的解決方案。 我正在做的是“標記”原始 NaN 值,然后用 NaN 替換“*”,使用ffill
,然后將原始 NaN 值放回原處。
df = df.replace(np.NaN, "<special>").replace("*", np.NaN).ffill().replace("<special>", np.NaN)
output:
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
您可以將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.