2014-07-23 15 views
8

Zastanawiam się, czy istnieje równoważny sposób dodawania wiersza do serii lub DataFrame z MultiIndex, ponieważ istnieje jeden indeks, tj. Przy użyciu .ix lub .loc?Dodawanie wiersza do MultiIndex DataFrame/Series

Myślałem naturalny sposób byłoby coś

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

ale to podnosi KeyError. Wiem, że mogę użyć metody .append(), ale byłoby mi wygodniej używać .ix [] lub .loc [].

tutaj przykład:

>>> 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 Files\Python27\lib\site-packages\pandas\core\indexing.py", line 96, in __setitem__ 
    indexer = self._convert_to_indexer(key, is_setter=True) 
    File "C:\Program Files\Python27\lib\site-packages\pandas\core\indexing.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" 

Odpowiedz

11

Musisz określić krotki dla multi-indeksowanie do pracy (i trzeba w pełni określić wszystkie osie, np : jest konieczne)

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 

Łatwiejsze ponowne wyindeksowanie i/lub dodanie/dołączenie nowej ramki danych. Zazwyczaj ustawienie (z tego rodzaju powiększeniem) ma sens tylko wtedy, gdy robisz to z niewielką liczbą wartości. Ponieważ tworzy to kopię, gdy to zrobisz.