La simple tâche consistant à ajouter une ligne à un pandas.DataFrame
semble être difficile à réaliser. Il y a 3 questions sur stackoverflow à ce sujet, mais aucune ne donne une réponse fonctionnelle.
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 l'une des rangées avec un dictionnaire ou un fichier pandas.Series
? Voici diverses 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 sert qu'à définir des 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
Bon, 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 des colonnes avec les valeurs, mais a perdu les étiquettes des lignes.
>>> 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 aussi échoué lamentablement.
Alors comment faites-vous ?
1 votes
Notez qu'il est assez inefficace d'ajouter des données ligne par ligne et pour de grands ensembles de données. Il serait beaucoup plus rapide de charger d'abord les données dans une liste de listes, puis de construire le DataFrame en une seule ligne à l'aide de la commande
df = pd.DataFrame(data, columns=header)
0 votes
Pourquoi est-il plus efficace de créer l'ensemble de données dans des listes et de dupliquer l'ensemble de données en mémoire sous la forme d'un DataFrame ? Cela semble très inefficace en termes d'utilisation de la mémoire - et serait probablement un problème pour les très grands ensembles de données.
0 votes
@xApple, je pense que vous avez rencontré le même problème que moi (pendant des jours), où je ne comprenais pas la différence entre Columns et Index - je pensais en termes de tableaux, où ceux-ci pouvaient être en fait row/col ou vice versa, sans différence. Je suis tout à fait d'accord avec vous pour dire que cette théorie de base sur la façon dont le dataframe est censé être utilisé et sur la façon de générer un DF ligne par ligne (typique lors de la lecture de données provenant d'une autre source) est remarquablement peu claire !