La tâche simple d'ajouter une ligne à un objet pandas.DataFrame
semble difficile à accomplir. Il y a 3 questions de stackoverflow relatives à cela, dont aucune ne donne de réponse satisfaisante.
Voici ce que j'essaie 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 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, cela ne concerne que la définition de valeurs individuelles dans le cadre de données.
>>> 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 sur 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 fais-tu?
df['y']
définira une colonne
puisque vous voulez définir une ligne, utilisez .loc
Notez que .ix
est équivalent ici, le vôtre a échoué car vous avez essayé d'assigner un dictionnaire à chaque élément de la ligne y
sans doute pas ce que vous voulez; la conversion en série indique à pandas que vous souhaitez aligner l'entrée (par exemple, vous n'avez pas à spécifier tous les éléments)
In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})
In [9]: df
Out[9]:
a b c d
x NaN NaN NaN NaN
y 1 5 2 3
z NaN NaN NaN NaN
Mon approche était, mais je ne peux pas garantir que c'est la solution la plus rapide.
df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
"firstname": "John",
"lastname": "Johny"
}, ignore_index=True)
Ceci est une version plus simple
df = DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`
Si vos lignes d'entrée sont des listes plutôt que des dictionnaires, voici la solution simple:
import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])
pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
# A B C
# 0 1 2 3
# 1 4 5 6