遍历几个值以填充“熊猫数据框”中的NaN

时间:2019-01-15 16:36:08

标签: python pandas dataframe series

我知道我无法用列表填充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

这是不是内置的,因为很难向量化吗?对于它的价值,这只是理论上的,我没有实际数据。

2 个答案:

答案 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))

然后您可以将locnp.resize结合使用:

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