Переиндексировать, чтобы вставить недостающие строки в мультииндексированном фрейме данных - PullRequest
0 голосов
/ 12 мая 2018

У меня есть мультииндексированный DataFrame с тремя уровнями индексов. Я хотел бы расширить свой третий уровень, чтобы он содержал все значения в данном диапазоне, но только для существующих значений в двух верхних уровнях. Например, предположим, что первый уровень - это имя, второй уровень - дата, а третий уровень - час. Я хотел бы иметь строки для всех 24 возможных часов (даже если некоторые в настоящее время отсутствуют), но только для уже существующих имен и дат. Значения в новых строках могут быть заполнены нулями.

Таким образом, простой пример ввода будет:

>>> import pandas as pd
>>> df = pd.DataFrame([[1,1,1,3],[2,2,1,4], [3,3,2,5]], columns=['A', 'B', 'C','val'])
>>> df.set_index(['A', 'B', 'C'], inplace=True)
>>> df
       val
A B C     
1 1 1    3
2 2 1    4
3 3 2    5

если требуемые значения для C равны [1,2,3], желаемый результат будет:

       val
A B C     
1 1 1    3
    2    0
    3    0
2 2 1    4
    2    0
    3    0
3 3 1    0
    2    5
    3    0

Я знаю, как этого добиться, используя groupby и применяя определенную функцию для каждой группы, но мне было интересно, есть ли более чистый способ сделать это с reindex (я не мог заставить one работать для случая MultiIndex, но, возможно, я что-то упустил)

1 Ответ

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

Использование -

partial_indices = [ i[0:2] for i in df.index.values ]
C_reqd = [1, 2, 3]
final_indices = [j+(i,) for j in partial_indices for i in C_reqd]
index = pd.MultiIndex.from_tuples(final_indices, names=['A', 'B', 'C'])
df2 = pd.DataFrame(pd.Series(0, index), columns=['val'])
df2.update(df)

выход

df2
       val
A B C
1 1 1  3.0
    2  0.0
    3  0.0
2 2 1  4.0
    2  0.0
    3  0.0
3 3 1  0.0
    2  5.0
    3  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...