[英]How to fill missing values in pandas series with 1 if and only if the last and next non missing value is 1
我有一個 pandas 系列,只有0
、 1
和np.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.