Переберите несколько значений, чтобы заполнить NaNs в Пандах. - PullRequest
0 голосов
/ 15 января 2019

Я знаю, что не могу заполнить NaN списком, как указано в документации для fillna. Что же тогда является предпочтительным способом использования списка значений для заполнения 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 голосов
/ 15 января 2019

Нет необходимости сначала преобразовывать значения в NaN. Итак, давайте предположим, что это отправная точка:

np.random.seed(0)
s = pd.Series(np.random.randint(0,100, 50))

Тогда вы можете использовать loc с np.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
0 голосов
/ 15 января 2019

Использование

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
...
...