Je comprends que les pandas sont conçus pour charger entièrement rempli,DataFrame
mais je dois créer un DataFrame vide puis ajouter des lignes, une par une . Quelle est la meilleure façon de procéder ?
J'ai réussi à créer un DataFrame vide avec:
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
Ensuite, je peux ajouter une nouvelle ligne et remplir un champ avec:
res = res.set_value(len(res), 'qty1', 10.0)
Cela fonctionne mais semble très étrange: - / (il échoue pour ajouter une valeur de chaîne)
Comment puis-je ajouter une nouvelle ligne à mon DataFrame (avec différents types de colonnes)?
Réponses:
Vous pouvez utiliser
df.loc[i]
, où la ligne avec indexi
correspondra à ce que vous spécifiez dans la trame de données.la source
.loc
fait référence à la colonne d'index, donc si vous travaillez avec un DataFrame préexistant avec un index qui n'est pas une séquence continue d'entiers commençant par 0 (comme dans votre exemple),.loc
remplacera les lignes existantes ou insérera des lignes, ou créer des lacunes dans votre index. Une approche plus robuste (mais pas infaillible) pour ajouter une trame de données existante de longueur non nulle serait:df.loc[df.index.max() + 1] = [randint(...
ou de préremplir l'index comme l'a suggéré @FooBar.df.index.max()
estnan
lorsque le DataFrame est vide.df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
Dans le cas où vous pouvez obtenir toutes les données pour la trame de données à l'avance, il existe une approche beaucoup plus rapide que l'ajout à une trame de données:
J'ai eu une tâche similaire pour laquelle l'ajout à un bloc de données ligne par ligne a pris 30 minutes, et la création d'un bloc de données à partir d'une liste de dictionnaires s'est terminée en quelques secondes.
la source
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.
( pandas.pydata.org/pandas-docs/stable/… )Vous pouvez utiliser
pandas.concat()
ouDataFrame.append()
. Pour plus d'informations et d'exemples, voir Fusionner, joindre et concaténer .la source
.loc
mécanisme qui peut être évité, surtout si vous faites attention.DataFrame.append()
, vous devez vous assurer que vos données de ligne sont également un DataFrame en premier lieu, pas une liste.Ça fait longtemps, mais j'ai aussi fait face au même problème. Et j'ai trouvé ici beaucoup de réponses intéressantes. Donc, je ne savais pas quelle méthode utiliser.
Dans le cas de l'ajout de nombreuses lignes à la trame de données, je me suis intéressé aux performances de vitesse . J'ai donc essayé les 4 méthodes les plus populaires et vérifié leur vitesse.
MISE À JOUR EN 2019 à l' aide de nouvelles versions de packages. Également mis à jour après le commentaire @FooBar
PERFORMANCE DE VITESSE
Résultats (en secondes):
Merci également à @krassowski pour ses commentaires utiles - J'ai mis à jour le code.
J'utilise donc l'addition par le biais du dictionnaire pour moi-même.
Code:
PS Je crois que ma réalisation n'est pas parfaite, et il y a peut-être une optimisation.
la source
df2.index.max()
for.loc
augmente inutilement la complexité de calcul. Simpledf2.loc[i] = ...
ferait l'affaire. Pour moi, cela a réduit le temps de 10 s à 8,64 sSi vous connaissez le nombre d'entrées ex ante, vous devez préallouer l'espace en fournissant également l'index (en prenant l'exemple de données d'une réponse différente):
Comparaison de vitesse
Et - à partir des commentaires - avec une taille de 6000, la différence de vitesse devient encore plus grande:
la source
la source
Pour un ajout efficace, voir Comment ajouter une ligne supplémentaire à une trame de données pandas et Configuration avec élargissement .
Ajoutez des lignes
loc/ix
sur des données d'index de clés inexistantes. par exemple :Ou:
la source
Vous pouvez ajouter une seule ligne en tant que dictionnaire à l'aide de l'
ignore_index
option.la source
f.append(<stuff>)
crée un nouvel objet, plutôt que de simplement ajouter à l'objet actuel en place, donc si vous essayez d'ajouter à une trame de données dans un script, vous devez diref = f.append(<stuff>)
Pour des raisons de Pythonic, ajoutez ici ma réponse:
la source
Vous pouvez également créer une liste de listes et la convertir en une trame de données -
donnant
la source
Ce n'est pas une réponse à la question OP mais un exemple de jouet pour illustrer la réponse de @ShikharDua ci-dessus que j'ai trouvé très utile.
Bien que ce fragment soit trivial, dans les données réelles, j'avais des milliers de lignes et de nombreuses colonnes, et je souhaitais pouvoir regrouper par différentes colonnes, puis effectuer les statistiques ci-dessous pour plus d'une colonne de taget. Il était donc très pratique d'avoir une méthode fiable pour construire le bloc de données une ligne à la fois. Merci @ShikharDua!
la source
Compris de manière simple et agréable:
la source
Vous pouvez utiliser un objet générateur pour créer Dataframe, qui sera plus efficace en mémoire sur la liste.
Pour ajouter des données brutes à DataFrame existant, vous pouvez utiliser la méthode append.
la source
Créez un nouvel enregistrement ( bloc de données) et ajoutez-le à old_data_frame .
transmettre la liste des valeurs et les noms de colonne correspondants pour créer un nouveau_enregistrement (data_frame)
la source
Voici comment ajouter / ajouter une ligne dans
pandas DataFrame
Il peut être utilisé pour insérer / ajouter une ligne dans des pandas DataFrame vides ou remplis
la source
Au lieu d'une liste de dictionnaires comme dans la réponse de ShikharDua, nous pouvons également représenter notre table comme un dictionnaire de listes , où chaque liste stocke une colonne dans l'ordre des lignes, étant donné que nous connaissons nos colonnes au préalable. À la fin, nous construisons notre DataFrame une fois.
Pour c colonnes et n lignes, cela utilise 1 dictionnaire et c listes, contre 1 liste et n dictionnaires. La méthode de la liste des dictionnaires a chaque dictionnaire stockant toutes les clés et nécessite la création d'un nouveau dictionnaire pour chaque ligne. Ici, nous ajoutons uniquement aux listes, ce qui est à temps constant et théoriquement très rapide.
la source
si vous souhaitez ajouter une ligne à la fin, ajoutez-la sous forme de liste
la source
Une autre façon de le faire (probablement pas très performante):
Vous pouvez également améliorer la classe DataFrame comme ceci:
la source
Tout ce dont vous avez besoin est
loc[df.shape[0]]
ouloc[len(df)]
ou
la source
Faites simple. En prenant la liste en entrée qui sera ajoutée en tant que ligne dans la trame de données: -
la source
Nous voyons souvent la construction
df.loc[subscript] = …
à affecter à une ligne DataFrame. Mikhail_Sam a posté des benchmarks contenant, entre autres, cette construction ainsi que la méthode utilisant dict et create DataFrame à la fin . Il a trouvé que ce dernier était de loin le plus rapide. Mais si nous remplaçons ledf3.loc[i] = …
(avec DataFrame préalloué) dans son code pardf3.values[i] = …
, le résultat change considérablement, en ce que cette méthode fonctionne de manière similaire à celle utilisant dict. Nous devons donc plus souvent prendredf.values[subscript] = …
en considération l'utilisation de . Cependant, notez que cela.values
prend un indice de base zéro, qui peut être différent du DataFrame.index.la source
# .loc with prealloc
), un autre exemple est dans la question que je dois comparer les données de chaque ligne d'un Pandas DataFrame avec les données du reste des lignes, est-il un moyen d'accélérer le calcul ? et sa réponse acceptée.pandas.DataFrame.append
DataFrame.append (auto, autre, ignore_index = False, verify_integrity = False, sort = False) → 'DataFrame'
Avec ignore_index défini sur True:
la source
avant d'aller ajouter une ligne, nous devons convertir la trame de données en dictionnaire, vous pouvez voir les clés sous forme de colonnes dans la trame de données et les valeurs des colonnes sont à nouveau stockées dans le dictionnaire, mais la clé pour chaque colonne est le numéro d'index dans la trame de données. Cette idée m'a fait écrire le code ci-dessous.
la source
Vous pouvez concaténer deux DataFrames pour cela. J'ai rencontré ce problème pour ajouter une nouvelle ligne à un DataFrame existant avec un index de caractères (non numérique). Donc, j'entre les données d'une nouvelle ligne dans un conduit () et l'index dans une liste.
la source
Cela prendra soin d'ajouter un élément à un DataFrame vide. Le problème est que
df.index.max() == nan
pour le premier index:la source