Я согласен с RafaelC, что заполнение вашего списка для данных 2018 года NaN для пропущенных значений - лучший способ сделать это.Вы можете использовать np.nan
от Numpy (который вы уже установили, поскольку у вас есть Pandas) для генерации NaN.
import pandas as pd
import numpy as np
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
index_yrs = [2016, 2017, 2018]
В качестве небольшого изменения в вашем коде я поместил данные за все три года вyears
список, который мы можем передать в качестве параметра data
для pd.DataFrame.Это исключает необходимость добавлять каждую строку к предыдущим.
r2016 = [26, 27, 25, 22, 20, 23, 22, 20, 20, 18, 18, 19]
r2017 = [20, 21, 18, 16, 15, 15, 15, 15, 13, 13, 14, 15]
r2018 = [16, 18, 18, 18, 17]
years = [r2016] + [r2017] + [r2018]
Вот так выглядят годы: [[26, 27, 25, 22, 20, 23, 22, 20, 20, 18, 18, 19], [20, 21, 18, 16, 15, 15, 15, 15, 13, 13, 14, 15], [16, 18, 18, 18, 17]].
Что касается наполнения 2018 года NaN, что-то вроде этого может помочь.Мы просто гарантируем, что если год будет иметь значения только для первых n месяцев, то оставшиеся месяцы будут заполнены NaN.
for year in years:
if len(year) < 12:
year.extend([np.nan] * (12 - len(year)))
Наконец, мы можем создать ваш фрейм данных, используя один вкладыш ниже вместо добавлениястрока за строкой.
df = pd.DataFrame(years, columns=months, index=index_yrs).astype(float)
Вывод:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2016 26.0 27.0 25.0 22.0 20.0 23.0 22.0 20.0 20.0 18.0 18.0 19.0
2017 20.0 21.0 18.0 16.0 15.0 15.0 15.0 15.0 13.0 13.0 14.0 15.0
2018 16.0 18.0 18.0 18.0 17.0 NaN NaN NaN NaN NaN NaN NaN
Вы можете заметить, что я преобразовал dtype значений в кадре данных в float, используя .astype(float)
.Я сделал это, чтобы сделать все ваши столбцы одинаковыми dtype.Если мы не позвоним .astype(float)
, то январь-май будет dtype int
, а июнь-декабрь будет dtype float64
.