2014-07-23 6 views
8

Mi chiedevo se esiste un modo equivalente per aggiungere una riga a una serie o DataFrame con un MultiIndex, poiché esiste un unico indice, cioè utilizzando .ix o .loc?aggiunta di una riga a un DataFrame/serie MultiIndex

ho pensato che il modo naturale sarebbe qualcosa di simile

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

ma che solleva una KeyError. So che posso usare .append(), ma troverei molto più ordinato usare .ix [] o .loc [].

qui un esempio:

>>> 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" 

risposta

11

È necessario specificare una tupla per il multi-indicizzazione di lavorare (e si deve specificare pienamente tutti gli assi, ad esempio, il : è necessaria)

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 

Più facile da reindicizzare e/o concat/aggiungere un nuovo dataframe. L'impostazione generale (con questo tipo di ingrandimento) ha senso solo se la si esegue con un numero ridotto di valori. Dato che questo fa una copia quando lo fai.