簡體   English   中英

Pandas Dataframe 中的插值函數

[英]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 = 0n*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.

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