我有一个熊猫系列,只有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替换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]=1
和0
。完成后,重新分配给系列,并为第一个和最后一个值估算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')