web-dev-qa-db-fra.com

Python pandas: remplit un cadre de données ligne par ligne

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?

104
xApple

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
73
Jeff

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)
56
flow

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>']`
21
Satheesh

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
14