Заполните столбцы с 0 в сводной таблице pandas - PullRequest
1 голос
/ 16 марта 2020

В одном из столбцов, если он отсутствует, как я могу заполнить его 0 вместо того, чтобы оставить его пустым?

MRE:

df = pd.DataFrame({"day":[3, 3, 3, 3, 3, 3, 3],
                   "hour":[15, 15, 15, 15, 19, 20, 21],
                   "location":["A", "A", "B", "C", "D", "A", "B"],
                   "numbers": [323, 2354, 124, 56, 45, 11, 44]})

df.pivot_table(index="location",
           columns=["day", "hour"],
           values = "numbers",
           fill_value=0,
           aggfunc="count").unstack().to_frame()

Какие выходные данные:

                            0
day   hour    location  
                 A          2
                 B          1
       15        C          0
                 D          0

                 A          0 
                 B          0
       19        C          0
                 D          1

                 A          1
                 B          0
 3      20       C          0
                 D          0

и т. Д. Я просто оставил пробел между ними для лучшей читаемости.

Как видите, час идет с 15 до 19. Я хочу включить часы = 16, 17, 18, которые все местоположения и все строки в столбце 0 как 0.

Таким образом, желаемый результат будет:

                            0
day   hour    location  
                 A          2
                 B          1
       15        C          0
                 D          0

                 A          0
                 B          0
       16        C          0
                 D          0

                 A          0
                 B          0
       17        C          0
                 D          0

                 A          0
                 B          0
       18        C          0
                 D          0

                 A          0 
                 B          0
       19        C          0
                 D          1

                 A          1
                 B          0
 3      20       C          0
                 D          0

Как этого добиться? Заранее спасибо.

1 Ответ

2 голосов
/ 16 марта 2020

Давайте добавим reindex метод с созданным pd.MultIndex, используя from_product уникальных массивов и диапазон часов.

df.pivot_table(index="location",
           columns=["day", "hour"],
           values = "numbers",
           fill_value=0,
           aggfunc="count").unstack().to_frame()\
  .reindex(pd.MultiIndex.from_product([df['day'].unique(),
                                       np.arange(df['hour'].min(),
                                                 df['hour'].max()),
                                       df['location'].unique()]), 
           fill_value=0)

Вывод:

        0
3 15 A  2
     B  1
     C  1
     D  0
  16 A  0
     B  0
     C  0
     D  0
  17 A  0
     B  0
     C  0
     D  0
  18 A  0
     B  0
     C  0
     D  0
  19 A  0
     B  0
     C  0
     D  1
  20 A  1
     B  0
     C  0
     D  0
...