добавление строки в Многоиндексный фрейм данных / Series

мне было интересно, есть ли эквивалентный способ добавить строку в серию или фрейм данных с Мультииндексом, как есть с одним индексом, т. е. с использованием .ix или .Лок?

Я думал, что естественный способ будет чем-то вроде

row_to_add = pd.MultiIndex.from_tuples()
df.ix[row_to_add] = my_row

но это вызывает KeyError. Я знаю, что могу использовать .append (), но я бы нашел его гораздо более аккуратным в использовании .іх[] или .линия контроля.][

вот пример:

>>> df = pd.DataFrame({'Time': [dt.datetime(2013,2,3,9,0,1), dt.datetime(2013,2,3,9,0,1)], 'hsec': [1,25], 'vals': [45,46]})
>>> df
                 Time  hsec  vals
0 2013-02-03 09:00:01     1    45
1 2013-02-03 09:00:01    25    46

[2 rows x 3 columns]
>>> df.set_index(['Time','hsec'],inplace=True)
>>> ind = pd.MultiIndex.from_tuples([(dt.datetime(2013,2,3,9,0,2),0)],names=['Time','hsec'])
>>> df.ix[ind] = 5

Traceback (most recent call last):
  File "<pyshell#201>", line 1, in <module>
    df.ix[ind] = 5
  File "C:Program FilesPython27libsite-packagespandascoreindexing.py", line 96, in __setitem__
    indexer = self._convert_to_indexer(key, is_setter=True)
  File "C:Program FilesPython27libsite-packagespandascoreindexing.py", line 967, in _convert_to_indexer
    raise KeyError('%s not in index' % objarr[mask])
KeyError: "[(Timestamp('2013-02-03 09:00:02', tz=None), 0L)] not in index"

1 ответов


вы должны указать Кортеж для мульти-индексация на работу (и вы должны полностью указать все оси, например,: осталось)

In [26]: df.ix[(dt.datetime(2013,2,3,9,0,2),0),:] = 5

In [27]: df
Out[27]: 
                          vals
Time                hsec      
2013-02-03 09:00:01 1       45
                    25      46
2013-02-03 09:00:02 0        5

легче переиндексировать и/или конкат / добавить новый фрейм данных. Обычно настройка (с таким расширением) имеет смысл, только если вы делаете это с небольшим количеством значений. Как это делает копию, когда вы делаете это.