pandas Series и индекс: почему при присваивании появляется NaN
При присваивании df["column"] = series pandas сопоставляет значения по меткам индекса, а не по порядку элементов. Если для метки DataFrame в Series нет значения, в новом столбце появится пропуск. Другая последовательность меток также может изменить порядок значений.
Как предсказать результат
Сравните df.index и series.index перед присваиванием. Не сбрасывайте индекс автоматически: сначала определите, нужны ли вам метки или позиции. В упражнении ниже требуется именно выравнивание по меткам, поэтому заменять Series списком нельзя.
Пример на других данных
import pandas as pd
df = pd.DataFrame({"item": ["Чай", "Кофе", "Сок"]}, index=[10, 20, 30])
s = pd.Series([7, 9], index=[30, 10])
df["price"] = s
print(df["price"].tolist())
print(df["price"].isna().tolist())
Результат:
[9.0, nan, 7.0]
[False, True, False]
Решите задачу
Ниже — условие и редактор Python с проверкой без регистрации. Пример выше показывает приём на других данных; для задачи соблюдайте её формат ввода и результата. Курс NumPy и pandas помогает пройти темы по порядку.
Выравнивание Series по индексу: предсказание NaN при присваивании столбца
Что уже дано
Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinцелое числоn— количество строк DataFrame. - Читает следующие
nстрок; каждая содержит два токена через пробел: целое числоaи целое числоb. Создаётpd.DataFrameс именемdfсо столбцами'A'и'B'и стандартнымRangeIndexот0доn-1. - Читает одну строку с несколькими токенами через пробел — индексы (целые числа) для новой Series. Создаёт
idx = [int(x) for x in line.split()]. - Читает следующую строку с таким же количеством токенов — значения (целые числа) для новой Series. Создаёт
pd.Seriesс этими значениями и индексомidx, называет еёs. - Присваивает
df['C'] = s— pandas выравниваетsпо меткам индексаdf. - Выводит в
stdoutтри строки:
- Строка 1: значения столбца
'A'через пробел. - Строка 2: значения столбца
'C'через пробел, гдеNaNвыводится строкойnan. - Строка 3:
C_nan_count: <k>, гдеk— количествоNaNв столбце'C'.
Для вывода значений столбцов используйте следующий подход: для каждого элемента выводите nan если pd.isna(v), иначе — целое число через int(v). Элементы разделяйте пробелами.
Ввод и вывод
Программа читает stdin и пишет в stdout.
Формат ввода
n
a_0 b_0
a_1 b_1
...
a_{n-1} b_{n-1}
idx_0 idx_1 ... idx_m
val_0 val_1 ... val_m
- Первая строка: целое
n(2 ≤ n ≤ 8). - Следующие
nстрок: пары целых чиселa b. - Строка с индексами Series: от 1 до
nцелых чисел из диапазона[0, n-1], все различные. - Строка со значениями Series: столько же целых чисел.
Формат вывода
Три строки:
- Значения
'A'через пробел (целые числа). - Значения
'C'через пробел (целые числа). C_nan_count: <k>.
Пример
- Ввод
4 10 2 20 5 30 1 40 3 0 2 100 300
- Вывод
10 20 30 40 100 nan 300 nan C_nan_count: 2
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Создание и изменение столбцов: векторные выражения, loc и выравнивание по индексу — задача по NumPy и pandas
- Pandas loc: присваивание по булевой маске
- Pandas loc: создать столбец и присвоить значения по условию
- pandas loc: обновление цен и пересчёт стоимости
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
