如何用1填充pandas系列中缺失的值当且仅当最后一个和下一个非缺失值为1时



我有一个熊猫系列,只有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替换np.nan值,当且仅当上一个和下一个非缺失值也是1,否则为0。因此,预期输出为:

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]=10。完成后,重新分配给系列,并为第一个和最后一个值估算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')

相关内容

最新更新