簡體   English   中英

前向填充 pandas dataframe 中的自定義值

[英]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.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM