Python pandas: remplir une ligne de données rangée par rangée


Answers

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)
Question

La tâche simple d'ajouter une ligne à un objet pandas.DataFrame semble être difficile à accomplir. Il y a 3 questions de relatives à ceci, aucune d'elles ne donne une réponse de travail.

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 façon 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 non-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 sert qu'à définir des valeurs individuelles dans la base 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 colonnes 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?




Si vos lignes d'entrée sont des listes plutôt que des dictionnaires, voici une 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