Создание новых строк с отсутствующими месяцем и годом и соответствующими значениями в виде нулей - PullRequest
0 голосов
/ 09 апреля 2020

Я извлек детали с помощью группировки по месяцам. Но, к сожалению, если данные отсутствуют в месяцах, запись за этот месяц не создается .

Пожалуйста, помогите мне создать новые записи для каждой компании, с которой начинается диапазон данных 2019 год и конец апреля заканчивается 2020 годом.

Company     year    month   Quantity
A           2019    4          1
A           2019    5          12
A           2019    6          13
A           2019    11         23
A           2020    2          34
B           2019    8          32
B           2019    12         2
B           2020    2          32

Точно в следующем формате. Любые входные данные могут быть очень полезны.

Company     year    month   Quantity
A           2019    1          0
A           2019    2          0
A           2019    3          0
A           2019    4          0
A           2019    5          12
A           2019    6          13
A           2019    7          0
A           2019    8          0
A           2019    9          0
A           2019    10         0
A           2019    11         23
A           2019    12         0
A           2020    1          0
A           2020    2          34
B           2019    1          0
B           2019    2          0
B           2019    3          0
B           2019    4          0
B           2019    5          0
B           2019    6          0
B           2019    7          0
B           2019    8          32
B           2019    9          0
B           2019    10         0
B           2019    11         0
B           2019    12         2
B           2020    1          0
B           2020    2          32

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Если хотите полные месяцы, используйте MultiIndex.from_product с Series.reindex:

mux = pd.MultiIndex.from_product([df['Company'].unique(),
                                  df['year'].unique(),
                                  range(1, 13)], names=['Company','year','month'])

df = df.set_index(['Company','year','month']).reindex(mux, fill_value=0).reset_index()

При необходимости отфильтруйте по минимальному и максимальному значениям времени по исходным данным Series.between по максимальному и минимальному времени:

orig = pd.to_datetime(df[['year','month']].assign(day=1))
new = pd.to_datetime(df1[['year','month']].assign(day=1))

df1 = df1[new.between(orig.min(), orig.max())]
print (df1)
   Company  year  month  Quantity
3        A  2019      4         1
4        A  2019      5        12
5        A  2019      6        13
6        A  2019      7         0
7        A  2019      8         0
8        A  2019      9         0
9        A  2019     10         0
10       A  2019     11        23
11       A  2019     12         0
12       A  2020      1         0
13       A  2020      2        34
27       B  2019      4         0
28       B  2019      5         0
29       B  2019      6         0
30       B  2019      7         0
31       B  2019      8        32
32       B  2019      9         0
33       B  2019     10         0
34       B  2019     11         0
35       B  2019     12         2
36       B  2020      1         0
37       B  2020      2        32
0 голосов
/ 09 апреля 2020

Вы можете создать диапазон дат, содержащий все месяцы, а затем переиндексировать фрейм данных:

# `all_date` contains every month start from min to max
date = pd.to_datetime(df[['year','month']].assign(day=1))
all_date = pd.date_range(month.min(), month.max(), freq='MS')

# the new_index has every combination of (Company, month start)
new_index = pd.MultiIndex.from_product([
    df['Company'].unique(),
    all_date
], names=['Company', 'date'])

# Reindex and filling the NAs
result = df.set_index(['Company', date]).reindex(new_index).reset_index()
result['year'] = result['date'].dt.year
result['month'] = result['date'].dt.month
result['Quantity'] = result['Quantity'].fillna(0)

Совет: не разбивайте дату на year и month. Дату часто легче проанализировать, если оставить ее как Timestamp вместо разделения ее компонентов.

...