我知道我无法用列表填充NaN,如fillna
的{{3}}中所述。那么,使用值列表填充NaN的首选方法是什么?所需的行为是遍历该列表并一次填写一个NaN。如果NaN数量超过列表中的数量,则重新开始。示例:
np.random.seed(0)
s = pd.Series(np.random.randint(0,100, 50))
s.loc[s > 25] = np.nan
s.fillna([10, 20, 30]) # Produces TypeError
所需的输出:
0 10
1 20
2 30
3 10
4 20
5 9.0
6 30
7 21.0
8 10
等
这是不是内置的,因为很难向量化吗?对于它的价值,这只是理论上的,我没有实际数据。
答案 0 :(得分:2)
使用
s.loc[s.isna()]=[10,20,30]*(s.isna().sum()//3)+[10,20,30][:s.isna().sum()%3]
s
Out[271]:
0 10.0
1 20.0
2 30.0
3 10.0
4 20.0
5 9.0
6 30.0
...
答案 1 :(得分:1)
无需先将值转换为NaN
。因此,让我们假设这个起点:
np.random.seed(0)
s = pd.Series(np.random.randint(0,100, 50))
mask = s > 25
s.loc[mask] = np.resize([10, 20, 30], mask.sum())
或者,用pd.Series.mask
:
s = s.mask(s > 25, np.resize([10, 20, 30], len(s.index)))
结果:
print(s.head(10))
# 0 10
# 1 20
# 2 30
# 3 10
# 4 20
# 5 9
# 6 30
# 7 21
# 8 10
# 9 20
# dtype: int32