簡體   English   中英

當且僅當最后一個和下一個非缺失值為 1 時,如何用 1 填充 pandas 系列中的缺失值

[英]How to fill missing values in pandas series with 1 if and only if the last and next non missing value is 1

我有一個 pandas 系列,只有01np.nan值:

pd.Series([0, np.nan, np.nan, 0, np.nan, np.nan, np.nan, 1, np.nan, 1, np.nan, 
np.nan, np.nan, 1, np.nan, 0, np.nan, np.nan, 1, np.nan, np.nan, np.nan, 1])

我想填充缺失值,但我的邏輯是當且僅當前一個和下一個非缺失值也為 1 時,用 1 替換np.nan值,否則為 0。所以預期的 output 是:

pd.Series([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1])

我怎樣才能做到這一點?

按照您的估算規定,如果需要估算,第一個和最后一個元素始終0 您可以在vals[i-1]*vals[i+1] == 1上通過for i in range(1, len(vals)-1)的所有索引對vals = ds.values進行檢查,設置vals[i]=1 ,否則為0 完成后,重新分配給 Series 並為第一個和最后一個值ds.fillna(0)

沒有內置方法可以做到這一點,您必須為此編寫自己的代碼。

import pandas as pd
import numpy as np

s = pd.Series([0, np.nan, np.nan, 0, np.nan, np.nan, np.nan, 1, np.nan, 1, np.nan,
               np.nan, np.nan, 1, np.nan, 0, np.nan, np.nan, 1, np.nan, np.nan, np.nan, 1])

vals = s.values.tolist()
look_left = [-1] * len(vals)
look_right = [-1] * len(vals)

for i in range(2):
    check = vals if i == 0 else vals[::-1]
    arr = look_left if i == 0 else look_right
    prev_seen = None
    for i, elem in enumerate(check):
        if elem in [0, 1]:
            arr[i] = elem
            prev_seen = elem
        else:
            arr[i] = prev_seen

look_right = look_right[::-1]

for i in range(len(vals)):

    if np.isnan(vals[i]):
        vals[i] = 1 if look_right[i] == 1 and look_left[i] == 1 else  0

s = pd.Series(vals)
print(s)

fillna向前填充一個值。

df.fillna(method='ffill')

暫無
暫無

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

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