Как добавить строки без значений для некоторых столбцов - PullRequest
0 голосов
/ 26 мая 2018

Я использую python 3.6.4 и pandas 0.23.0.Я ссылался на документацию панд 0.23.0 для конструктора и добавления.Здесь не упоминается ничего о несуществующих ценностях.Я не нашел подобного примера.

Рассмотрим следующий код:

import pandas as pd

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

index_yrs = [2016, 2017, 2018]

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]

df = pd.DataFrame([r2016], columns = months, index = [index_yrs[0]])
df = df.append(pd.DataFrame([r2017], columns = months, index = [index_yrs[1]]))

Теперь, как добавить r2018, который имеет данные только до мая месяца?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы можете добавить строку, используя pd.DataFrame.loc через серию.Таким образом, вам нужно только преобразовать ваш массив в pd.Series объект перед добавлением строки:

df.loc[index_yrs[2]] = pd.Series(r2018, index=df.columns[:len(r2018)])

print(df)

       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

Однако я настоятельно рекомендую вам сформировать список списков (с отступами) перед единственным добавлением.Это связано с тем, что list.append, или построение с использованием списка, обходится дешевле, чем повторяющиеся pd.DataFrame.append или pd.DataFrame.loc.

. Приведенное выше решение рекомендуется, если вам абсолютно необходимо добавлять по одной строке за раз.

0 голосов
/ 27 мая 2018

Я согласен с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...