Je suis nouveau sur les pandas et j'essaie de comprendre comment ajouter plusieurs colonnes aux pandas simultanément. Toute aide ici est appréciée. Idéalement, je voudrais faire cela en une seule étape plutôt qu'en plusieurs étapes répétées ...
import pandas as pd
df = {'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here...
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
Réponses:
Je me serais attendu à ce que votre syntaxe fonctionne aussi. Le problème se pose car lorsque vous créez de nouvelles colonnes avec la syntaxe de la liste de colonnes (
df[[new1, new2]] = ...
), les pandas exigent que le côté droit soit un DataFrame (notez que cela n'a pas vraiment d'importance si les colonnes du DataFrame ont les mêmes noms que les colonnes vous créez).Votre syntaxe fonctionne bien pour attribuer des valeurs scalaires aux colonnes existantes , et pandas est également heureux d'attribuer des valeurs scalaires à une nouvelle colonne en utilisant la syntaxe à colonne unique (
df[new1] = ...
). La solution consiste donc soit à convertir cela en plusieurs affectations à une seule colonne, soit à créer un DataFrame approprié pour le côté droit.Voici plusieurs approches qui vont travailler:
Puis l'un des éléments suivants:
1) Trois affectations en une, en utilisant le déballage de liste:
2)
DataFrame
développe commodément une seule ligne pour correspondre à l'index, vous pouvez donc le faire:3) Créez un bloc de données temporaire avec de nouvelles colonnes, puis combinez-le avec le bloc de données d'origine plus tard:
4) Similaire au précédent, mais en utilisant à la
join
place deconcat
(peut être moins efficace):5) Utiliser un dict est une façon plus "naturelle" de créer le nouveau bloc de données que les deux précédents, mais les nouvelles colonnes seront triées par ordre alphabétique (au moins avant Python 3.6 ou 3.7 ):
6) À utiliser
.assign()
avec plusieurs arguments de colonne.J'aime beaucoup cette variante sur la réponse de @ zero, mais comme la précédente, les nouvelles colonnes seront toujours triées par ordre alphabétique, du moins avec les premières versions de Python:
7) C'est intéressant (basé sur https://stackoverflow.com/a/44951376/3830997 ), mais je ne sais pas quand cela en vaudrait la peine:
8) En fin de compte, il est difficile de battre trois missions distinctes:
Remarque: beaucoup de ces options ont déjà été couvertes dans d'autres réponses: ajoutez plusieurs colonnes à DataFrame et définissez-les égales à une colonne existante , est-il possible d'ajouter plusieurs colonnes à la fois à un pandas DataFrame? , Ajoutez plusieurs colonnes vides à pandas DataFrame
la source
.reindex
) ne modifierait-elle pas l'index du dataframe? Pourquoi quelqu'un voudrait-il modifier inutilement l'index lors de l'ajout de colonnes à moins que ce ne soit un objectif explicite ....reindex()
est utilisé avec l'columns
argument, donc il ne change que la colonne "index" (noms). Cela ne modifie pas l'index de ligne.OrderedDict
: par exemple,df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})
vsdf = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
join
, assurez-vous qu'il n'y a pas de doublons dans votre index (ou utilisez unreset_index
premier). Cela pourrait vous faire gagner quelques heures de débogage.Vous pouvez utiliser
assign
avec un dict de noms de colonnes et de valeurs.la source
df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
df.assign(col_new_1=np.nan, col2_new_2='dogs', col3_new_3=3)
. Cela maintient l'ordre.Avec l'utilisation de concat :
Pas très sûr de ce que vous vouliez faire
[np.nan, 'dogs',3]
. Peut-être maintenant les définir comme valeurs par défaut?la source
utilisation de la compréhension de liste,
pd.DataFrame
etpd.concat
la source
si vous ajoutez beaucoup de colonnes manquantes (a, b, c, ....) avec la même valeur, ici 0, j'ai fait ceci:
Il est basé sur la deuxième variante de la réponse acceptée.
la source
Je veux juste souligner cette option2 dans la réponse de @Matthias Fripp
est déjà documenté dans la propre documentation de pandas http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
la source
pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
réplique la ligne qui lui est donnée pour créer un dataframe entier de la même longueur que l'index.Si vous souhaitez simplement ajouter de nouvelles colonnes vides, la réindexation fera le travail
exemple de code complet
sinon aller pour des zéros répondent avec assign
la source
Je ne suis pas à l'aise avec "Index" et ainsi de suite ... pourrait apparaître comme ci-dessous
la source