Вставка «пропущенных» многоиндексных строк в кадр данных Pandas - PullRequest
0 голосов
/ 31 января 2019

У меня есть пандас DataFrame с двухуровневым мультииндексом.Второй уровень числовой и должен сортироваться и последовательно для каждого уникального значения индекса первого уровня, но имеет пробелы.Как вставить «пропущенные» строки?Пример ввода:

import pandas as pd
df = pd.DataFrame(list(range(5)),
                  index=pd.MultiIndex.from_tuples([('A',1), ('A',3),
                                                   ('B',2), ('B',3), ('B',6)]),
                  columns='value')
#     value
#A 1      0
#  3      1
#B 2      2
#  3      3
#  6      4

Ожидаемый результат:

#     value
#A 1      0
#  2    NaN
#  3      1
#B 2      2
#  3      3
#  4    NaN
#  5    NaN
#  6      4

Я подозреваю, что мог бы использовать resample, но у меня возникли проблемы с преобразованием чисел во что-либо похожее на дату.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

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

new_index = d.index.to_frame()\
                .groupby(0)[1]\
                .apply(lambda x:
                         pd.Series(1, index=range(x.min(), x.max() + 1))).index
d.reindex(new_index)
0 голосов
/ 31 января 2019

Если есть воля, есть способ.Я не горжусь этим, но, думаю, это работает.

Попробуйте:

def f(x):
    levels = x.index.remove_unused_levels().levels
    x = x.reindex(pd.MultiIndex.from_product([levels[0], np.arange(levels[1][0], levels[1][-1]+1)]))
    return x

df.groupby(level=0, as_index=False, group_keys=False).apply(f)

Вывод:

     value
A 1    0.0
  2    NaN
  3    1.0
B 2    2.0
  3    3.0
  4    NaN
  5    NaN
  6    4.0
...