Python pandas: remplissez un dataframe ligne par ligne
La simple tâche de l'ajout d'une ligne à une pandas.DataFrame
objet semble être difficile à accomplir. Il y a 3 stackoverflow les questions relatives au présent, aucune de donner un travail de réponse.
Voici ce que je suis en train 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 dans l'une des lignes avec un dictionnaire ou un pandas.Series
? Voici les 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'
Très peu de message d'erreur.
>>> 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 c'est uniquement pour le réglage 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
Bien, je ne veux pas ignorer l'indice, 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 n'a aligner les noms de colonne avec les valeurs, mais il 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
Aussi lamentablement échoué.
Alors, comment faites-vous ?
Vous devez vous connecter pour publier un commentaire.
df['y']
va définir une colonnepuisque vous souhaitez définir une ligne, utilisez
.loc
Noter que
.ix
est équivalent ici, le vôtre a échoué parce que vous avez essayé d'attribuer un dictionnairepour chaque élément de la ligne
y
probablement pas ce que vous voulez; la conversion à une Série raconte les pandasque vous souhaitez aligner l'entrée (par exemple, ensuite, vous n'avez pas à spécifier tous les éléments)
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'])
de travail?pandas.Series
pour chaque ligne? Ne serait-il pas préférable de remplir un pré-créé la série de l'objet?pandas.series
doit être une liste de pré-calculé des valeurs, au lieu d'un dictionnaire dont les éléments sont spécifiés, un par un? Je suis en train d'essayer avecdf.loc['y'] = pd.Series(mylist,index=df.index)
mais il ne fonctionne pas.Mon approche était, mais je ne peux pas garantir que c'est la solution la plus rapide.
append
les données pour le dataframe.C'est une version plus simple
Si vos lignes d'entrée sont des listes plutôt que des dictionnaires, alors la suite est une solution simple: