[英]Interpolate function in Pandas Dataframe
哪些方程用於在 Pandas 中插入 DataFrame?
閱讀以下鏈接,我找不到與它們相關的任何內容。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.interpolate.html
我需要這個:
但我不確定interpolate()
函數是否在做同樣的事情。 如果是這種情況,無論如何我可以將其更改為那樣工作嗎?
不幸的是, interpolate
方法並沒有完全做到這一點。 但是,仍然有可能實現您想要的。
簡答
df.interpolate(limit=1).mul(~(df.shift(-1).isna() & df.isna())).fillna(0)
一步一步的解釋
默認情況下, interpolate 方法將值視為等距。 因此,例如,如果您輸入[0,NaN,10,NaN,NaN,16]
,您將得到[0,5,10,12,14,16]
。 此行為由插值函數的method
參數控制。 你不必在你的情況下改變它。
>>> df = pd.DataFrame([np.nan, 10, np.nan, 20, 17, np.nan, np.nan, 14, np.nan, 10, np.nan], columns=["value"])
>>> df
value
0 NaN
1 10.0
2 NaN
3 20.0
4 17.0
5 NaN
6 NaN
7 14.0
8 NaN
9 10.0
10 NaN
>>> df.interpolate()
value
0 NaN
1 10.0
2 15.0
3 20.0
4 17.0
5 16.0
6 15.0
7 14.0
8 12.0
9 10.0
10 10.0
現在,默認行為將替換任何 NaN,但您不希望替換連續的 NaN,因此您需要使用limit
參數。
此參數限制將被替換的連續 NaN 的數量,但至關重要的是,如果將限制設置為 1,則仍將替換連續 NaN 的第一個 NaN; 你不想要那個!
>>> df.interpolate(limit=1)
value
0 NaN
1 10.0
2 15.0
3 20.0
4 17.0
5 16.0
6 NaN
7 14.0
8 12.0
9 10.0
10 10.0
要擺脫這些第一個值,您需要知道哪些值是 NaN 並且直接跟在另一個 NaN 之后。 用這個 :
>>> df.shift(-1).isna() & df.isna()
value
0 False
1 False
2 False
3 False
4 False
5 True
6 False
7 False
8 False
9 False
10 True
然后,您可以將數據幀乘以該表達式的否定 ( ~
)。 (注意n*False = 0
和n*True = n
)`
>>> df.interpolate(limit=1).mul(~(df.shift(-1).isna() & df.isna()))
value
0 NaN
1 10.0
2 15.0
3 20.0
4 17.0
5 0.0
6 NaN
7 14.0
8 12.0
9 10.0
10 0.0
最后,使用fillna
將剩余的 NaN 值替換為 0
>>> df.interpolate(limit=1).mul(~(df.shift(-1).isna() & df.isna())).fillna(0)
value
0 0.0
1 10.0
2 15.0
3 20.0
4 17.0
5 0.0
6 0.0
7 14.0
8 12.0
9 10.0
10 0.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.