Заполнить недостающие индексы DataFrame

Даны две панды данных dfa а также dfbКак я могу убедиться, что MultiIndex каждого DataFrame содержит все строки из другого?

In [147]: dfa
Out[147]: 
        c
a b      
0 5  10.0
1 6  11.0
2 7  12.0
3 8  13.5
4 9  14.0

In [148]: dfb
Out[148]: 
      c
a b    
0 5  10
2 7  12
3 8  13
4 9  14

Вот, dfb не хватает индекса (1, 6):

In [149]: dfa - dfb
Out[149]: 
       c
a b     
0 5  0.0
1 6  NaN
2 7  0.0
3 8  0.5
4 9  0.0

... но dfa может также отсутствовать индексы из dfb, Значение должно быть 0 где мы вставляем отсутствующий индекс в каждом кадре данных.

Другими словами, каждый индекс DataFrame должен быть объединением двух мультииндексов, где добавленная строка получает значение 0.

1 ответ

Решение

Я думаю тебе нужно DataFrame.sub с параметром fill_value если нужно заменить NaN к некоторому значению:

df = dfa.sub(dfb, fill_value=0)
print (df)
        c
a b      
0 5   0.0
1 6  11.0
2 7   0.0
3 8   0.5
4 9   0.0
df = dfb.sub(dfa, fill_value=0)
print (df)
      c
a b    
0 5  10
1 6   0
2 7  12
3 8  13
4 9  14

Или если нужно union из индексов добавить reindex:

mux = dfa.index.union(dfb.index)
print (mux)
MultiIndex(levels=[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]],
           labels=[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]],
           names=['a', 'b'],
           sortorder=0)

print (dfa.reindex(mux, fill_value=0))
        c
a b      
0 5  10.0
1 6  11.0
2 7  12.0
3 8  13.5
4 9  14.0

print (dfb.reindex(mux, fill_value=0))
      c
a b    
0 5  10
1 6   0
2 7  12
3 8  13
4 9  14

Для расширения до полного декартова произведения всех встречающихся значений MultiIndex это прекрасно работает:

from itertools import product

df = dfa.loc[0:2]
print(df)

        c
a b      
0 5  10.0
1 6  11.0
2 7  12.0

# build full cartesian product index
cpr_index = product(*(df.index.get_level_values(icol) for icol in df.index.names))
# and generate the missing elements, filling with -1
print(df.reindex(cpr_index, fill_value=-1))

        c
a b      
0 5  10.0
  6  -1.0
  7  -1.0
1 5  -1.0
  6  11.0
  7  -1.0
2 5  -1.0
  6  -1.0
  7  12.0

в основном это создает полностью заполненный тензор или матрицу, заполняющую значения по умолчанию. для частичного полного заполнения (например: для всех a >= 1) продукт должен быть соответствующим образом обработан.

Другие вопросы по тегам