Как вписать значения по умолчанию в столбцы данных Pandas? - PullRequest
1 голос
/ 21 октября 2019

Ниже следует df.head() набора данных с датой, установленной в качестве индекса.

               Article_ID Country_Code Sold_Units
     Date           
2017-01-01        3576        AT         1
2017-01-02        1579        FR         1
2017-01-02         332        FI         2
2017-01-03        3576        AT         1
2017-01-03         332        SE         1

Код страны имеет 4 значения «AT, FR, FI, SE». Я хочу добавить эти 4 country_codes к каждой отдельной дате, если они не присутствуют в эти даты, и присвоить их значения 0 в Article_ID и Sold_Units.

Пример вывода в основном должен выглядеть следующим образом:

               Article_ID Country_Code Sold_Units
     Date           
2017-01-01        3576        AT         1
2017-01-01          0         FR         0    # FR FI SE added with 0s.
2017-01-01          0         FI         0
2017-01-01          0         SE         0
2017-01-02          0         AT         0    # AT, SE added
2017-01-02        1579        FR         1
2017-01-02         332        FI         2
2017-01-02          0         SE         0
2017-01-03        3576        AT         1
2017-01-03          0         FR         0    # FR, FI added
2017-01-03          0         FI         0
2017-01-03         332        SE         1

Как добавить такие значения по умолчанию для каждого кода страны?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Решения для уникальных DatetimeIndex с Country_Code комбинациями:

Создание MultiIndex путем добавления Country_Code к DatetimeIndex со всеми комбинациями уникальных значений даты и времени с кодами с DataFrame.reindex:

df = (df.set_index('Country_Code', append=True)
        .reindex(pd.MultiIndex.from_product([df.index.unique(), df['Country_Code'].unique()], 
                                            names=['Date','Country_Code']), fill_value=0)
        .reset_index(level=1))
print (df)
           Country_Code  Article_ID  Sold_Units
Date                                           
2017-01-01           AT        3576           1
2017-01-01           FR           0           0
2017-01-01           FI           0           0
2017-01-01           SE           0           0
2017-01-02           AT           0           0
2017-01-02           FR        1579           1
2017-01-02           FI         332           2
2017-01-02           SE           0           0
2017-01-03           AT        3576           1
2017-01-03           FR           0           0
2017-01-03           FI           0           0
2017-01-03           SE         332           1

Или используйте DataFrame.unstack с DataFrame.stack:

df = (df.set_index('Country_Code', append=True)
        .unstack(fill_value=0)
        .stack()
        .reset_index(level=1))

print (df)
           Country_Code  Article_ID  Sold_Units
Date                                           
2017-01-01           AT        3576           1
2017-01-01           FI           0           0
2017-01-01           FR           0           0
2017-01-01           SE           0           0
2017-01-02           AT           0           0
2017-01-02           FI         332           2
2017-01-02           FR        1579           1
2017-01-02           SE           0           0
2017-01-03           AT        3576           1
2017-01-03           FI           0           0
2017-01-03           FR           0           0
2017-01-03           SE         332           1

Решение для нескольких значений вdatetime с кодами стран:

Ошибка означает, что данные похожи на:

print (df)
            Article_ID Country_Code  Sold_Units
Date                                           
2017-01-01        3576           AT           1
2017-01-02        1579           FI           1 <-FI
2017-01-02         332           FI           2 <-FI
2017-01-03        3576           AT           1
2017-01-03         332           SE           1

df = (df.groupby(['Date','Country_Code'])
        .sum()
        .unstack(fill_value=0)
        .stack()
        .reset_index(level=1))
print (df)
           Country_Code  Article_ID  Sold_Units
Date                                           
2017-01-01           AT        3576           1
2017-01-01           FI           0           0
2017-01-01           SE           0           0
2017-01-02           AT           0           0
2017-01-02           FI        1911           3
2017-01-02           SE           0           0
2017-01-03           AT        3576           1
2017-01-03           FI           0           0
2017-01-03           SE         332           1
0 голосов
/ 21 октября 2019

Другое решение с использованием pivot_table:

import pandas as pd

df = pd.DataFrame({'Date': {0: '2017-01-01', 1: '2017-01-02', 2: '2017-01-02', 3: '2017-01-03', 4: '2017-01-03'},
                   'Article_ID': {0: 3576, 1: 1579, 2: 332, 3: 3576, 4: 332},
                   'Country_Code': {0: 'AT', 1: 'FR', 2: 'FI', 3: 'AT', 4: 'SE'},
                   'Sold_Units': {0: 1, 1: 1, 2: 2, 3: 1, 4: 1}})

df.set_index("Date",inplace=True)

result = (df.pivot_table(index="Date", columns="Country_Code", values=["Article_ID","Sold_Units"],aggfunc="mean")
         .fillna("0").stack().reset_index(level=1))

print (result)

#
           Country_Code Article_ID Sold_Units
Date                                         
2017-01-01           AT       3576          1
2017-01-01           FI          0          0
2017-01-01           FR          0          0
2017-01-01           SE          0          0
2017-01-02           AT          0          0
2017-01-02           FI        332          2
2017-01-02           FR       1579          1
2017-01-02           SE          0          0
2017-01-03           AT       3576          1
2017-01-03           FI          0          0
2017-01-03           FR          0          0
2017-01-03           SE        332          1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...