Il semplice compito di aggiungere una riga a un pandas.DataFrame
oggetto sembra essere difficile da realizzare. Ci sono 3 domande stackoverflow relative a questo, nessuna delle quali fornisce una risposta funzionante.
Ecco cosa sto cercando di fare. Ho un DataFrame di cui conosco già la forma, nonché i nomi delle righe e delle colonne.
>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
a b c d
x NaN NaN NaN NaN
y NaN NaN NaN NaN
z NaN NaN NaN NaN
Ora, ho una funzione per calcolare iterativamente i valori delle righe. Come posso compilare una delle righe con un dizionario o un pandas.Series
? Ecco vari tentativi falliti:
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df['y'] = y
AssertionError: Length of values does not match length of index
Apparentemente ha provato ad aggiungere una colonna anziché una riga.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
Messaggio di errore molto poco informativo.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)
Apparentemente è solo per l'impostazione di singoli valori nel frame di dati.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True
Bene, non voglio ignorare l'indice, altrimenti ecco il risultato:
>>> df.append(y, ignore_index=True)
a b c d
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 1 5 2 3
Allineava i nomi delle colonne con i valori, ma perse le etichette delle righe.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.ix['y'] = y
>>> df
a b \
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
c d
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
Anche quello fallì miseramente.
Quindi come lo fai?
loc
attributo del data frame definisce uno speciale__setitem__
che fa la magia suppongo.