Pandas обрабатывает пропущенные значения при переходе от фрейма данных к сводной таблице

Учитывая следующий фрейм данных pandas:

df = pd.DataFrame({'A': ['foo' ] * 3 + ['bar'],
         'B': ['w','x']*2,
         'C': ['y', 'z', 'a','a'],
         'D': rand.randn(4),
          })

print df.to_string()
"""
     A  B  C           D
0  foo  w  y  0.06075020
1  foo  x  z  0.21112476
2  foo  w  a  0.01652757
3  bar  x  a  0.17718772
"""

Обратите внимание, что здесь нет комбинации bar,w. При выполнении следующих действий:

pv0 = pandas.pivot_table(df, rows=['A','B'],cols=['C'], aggfunc=numpy.sum)

pv0.ix['bar','x'] #returns result

pv0.ix['bar','w'] #key error though i would like it to return all Nan's

pv0.index #returns 
[(bar, x), (foo, w), (foo, x)]

Пока в столбце «C» есть хотя бы одна запись, как в случае foo,x (у него есть только значение «z» в столбце «C»), он будет возвращать NaN для других значений столбца « C' отсутствует для foo,x (например, 'a', 'y')

Я хотел бы иметь все комбинации мультииндексов, даже те, у которых нет данных для всех значений столбцов.

pv0.index #I would like it to return
[(bar, w), (bar, x), (foo, w), (foo, x)]

Я могу обернуть команды .ix в блоки try/except, но есть ли способ, которым панды могут заполнить это автоматически?


person Paul    schedule 13.11.2013    source источник


Ответы (1)


Вы можете использовать метод reindex():

>>> df1 = pd.pivot_table(df, rows=['A','B'], cols='C', aggfunc=np.sum)
>>> df1
              D                   
C             a        y         z
A   B                             
bar x  0.161702      NaN       NaN
foo w  0.749007  0.85552       NaN
    x       NaN      NaN  0.458701

>>> index = list(iter.product(df['A'].unique(), df['B'].unique()))
>>> df1.reindex(index)
              D                   
C             a        y         z
foo w  0.749007  0.85552       NaN
    x       NaN      NaN  0.458701
bar w       NaN      NaN       NaN
    x  0.161702      NaN       NaN
person Roman Pekar    schedule 13.11.2013
comment
Ааа, интересно использовать index = list(iter.product(df['A'].unique(), df['B'].unique())) и будет работать. Позвольте мне посмотреть, что произойдет, если появится что-то еще, и я приму ваш ответ. - person Paul; 13.11.2013
comment
Я обнаружил, что для этого хорошо работает переиндексация, вам просто нужно создать полный индекс :) - person Roman Pekar; 13.11.2013
comment
Теперь вы можете сделать это с помощью pd.MultiIndex.from_product (как в этом ответе Энди Хейдена: -pandas-table" title="обеспечение того, чтобы декартово произведение ключей отображалось в таблице pandas"> stackoverflow.com/questions/16994485/). - person John Faben; 17.07.2017