La simple tâche d'ajouter une ligne à un pandas.DataFrame
objet semble être difficile à accomplir. Il y a 3 questions de stackoverflow liées à cela, dont aucune ne donne de réponse fonctionnelle.
Voici ce que j'essaye de faire. J'ai un DataFrame dont je connais déjà la forme ainsi que les noms des lignes et des colonnes.
>>> 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
Maintenant, j'ai une fonction pour calculer les valeurs des lignes de manière itérative. Comment puis-je remplir l'une des lignes avec un dictionnaire ou un pandas.Series
? Voici différentes tentatives qui ont échoué:
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df['y'] = y
AssertionError: Length of values does not match length of index
Apparemment, il a essayé d'ajouter une colonne au lieu d'une ligne.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
Message d'erreur très peu informatif.
>>> 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)
Apparemment, ce n'est que pour définir des valeurs individuelles dans le dataframe.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True
Eh bien, je ne veux pas ignorer l'index, sinon voici le résultat:
>>> 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
Il a aligné les noms de colonne avec les valeurs, mais a perdu les étiquettes de ligne.
>>> 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
Cela a également échoué lamentablement.
Alors, comment faites-vous cela?
loc
attribut de la trame de données définit un spécial__setitem__
qui fait la magie je suppose.df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])
fonctionne?Mon approche était, mais je ne peux pas garantir que ce soit la solution la plus rapide.
la source
append
intégriez explicitement les données au dataframe.Ceci est une version plus simple
la source
Si vos lignes d'entrée sont des listes plutôt que des dictionnaires, voici une solution simple:
la source