Comment ajouter une colonne vide à une trame de données?
262
Quelle est la façon la plus simple d'ajouter une colonne vide à un DataFrameobjet pandas ? Le meilleur sur lequel je suis tombé est quelque chose comme
Voulez-vous réellement une colonne contenant des chaînes vides ou plutôt N/A?
filmeur
Réponses:
420
Si je comprends bien, le devoir devrait remplir:
>>>import numpy as np>>>import pandas as pd>>> df = pd.DataFrame({"A":[1,2,3],"B":[2,3,4]})>>> df
A B012123234>>> df["C"]="">>> df["D"]= np.nan>>> df
A B C D012NaN123NaN234NaN
Cette réponse vient de créer de nouvelles lignes pour moi.
logicbloke
@logicbloke pouvez-vous fournir un exemple où cela se produit?
craymichael
@craymichael Cela fait un moment, mais je crois que j'avais des colonnes indexées sans numéro et des lignes nommées et cela a juste créé une nouvelle ligne à la fin.
logicbloke
1
Si le dfest vide, vous voudrez peut-être utiliser df['new'] = pd.Series() (voir ma réponse ci-dessous)
Carsten
comment ajouter plusieurs colonnes vides?
M. Mariscal
46
Pour compléter la réponse de DSM et en s'appuyant sur cette question associée , je diviserais l'approche en deux cas:
Ajouter une seule colonne: attribuez simplement des valeurs vides aux nouvelles colonnes, par exemple df['C'] = np.nan
Ajout de plusieurs colonnes: je suggère d'utiliser la .reindex(columns=[...])méthode des pandas pour ajouter les nouvelles colonnes à l'index des colonnes de la trame de données. Cela fonctionne également pour ajouter plusieurs nouvelles lignes avec .reindex(rows=[...]). Notez que les versions plus récentes de Pandas (v> 0.20) vous permettent de spécifier un axismot clé plutôt que de l'attribuer explicitement à columnsou rows.
mydf = mydf.reindex(mydf.columns.tolist()+['newcol1','newcol2'], axis=1)# version > 0.20.0
Vous pouvez également toujours concaténer une nouvelle trame de données (vide) avec la trame de données existante, mais cela ne me semble pas aussi pythonique :)
Exemple pour version >= 0.20.0supprimer le DataFrame et ajouter les nouvelles colonnes en tant que lignes. Exemple de version < 0.20.0travaux très bien sur la version Pandas0.24.1
Lalo
@emunsing En recherchant une réponse à cette question, j'ai finalement trouvé votre réponse utile. Dans un premier temps , cependant, il ne fonctionnait pas pour moi comme Pandas exige , axis=1dans version = 0.25. J'ai tenté de modifier votre réponse pour inclure la version mise à jour, mais j'ai été rejeté par @kenlukas et @il_raffa. J'espère que tout le monde a du mal à comprendre pourquoi votre réponse ne fonctionne pas pour eux - comme moi - tombe au moins sur ce commentaire.
Griff
@Griff - J'ai maintenant mis à jour ma réponse pour être plus précis et explicite sur les problèmes de compatibilité des versions. Merci d'avoir souligné cela.
annulation
35
une solution encore plus simple est:
df = df.reindex(columns = header_list)
où "header_list" est une liste des en-têtes que vous souhaitez voir apparaître.
tout en-tête inclus dans la liste qui ne se trouve pas déjà dans la trame de données sera ajouté avec des cellules vides ci-dessous.
donc si
header_list =['a','b','c','d']
puis c et d seront ajoutés sous forme de colonnes avec des cellules vides
Plus précisément, les colonnes seront ajoutées avec des NaN.
broccoli2000
19
À partir de v0.16.0, DF.assign()pourrait être utilisé pour affecter de nouvelles colonnes ( simples / multiples ) à a DF. Ces colonnes sont insérées par ordre alphabétique à la fin du DF.
Cela devient avantageux par rapport à une affectation simple dans les cas où vous souhaitez effectuer une série d'opérations chaînées directement sur la trame de données retournée.
Considérez le même DFexemple démontré par @DSM:
df = pd.DataFrame({"A":[1,2,3],"B":[2,3,4]})
dfOut[18]:
A B012123234
df.assign(C="",D=np.nan)Out[21]:
A B C D012NaN123NaN234NaN
Notez que cela retourne une copie avec toutes les colonnes précédentes ainsi que celles nouvellement créées. Pour que l'original DFsoit modifié en conséquence, utilisez-le comme: df = df.assign(...)car il ne prend pas en charge le inplacefonctionnement actuellement.
La réponse de @ emunsing est vraiment cool pour ajouter plusieurs colonnes, mais je n'ai pas pu le faire fonctionner pour moi en python 2.7. Au lieu de cela, j'ai trouvé que cela fonctionne:
Le code ci-dessous répond à la question "Comment ajouter n nombre de colonnes vides à ma trame de données existante". Afin de garder les solutions à des problèmes similaires en un seul endroit, je les ajoute ici.
Approche 1 (pour créer 64 colonnes supplémentaires avec des noms de colonne de 1 à 64)
m = list(range(1,65,1))
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'')#df is the dataframe that already exists
Approche 2 (pour créer 64 colonnes supplémentaires avec des noms de colonne de 1 à 64)
df['column']=None#This works. This will create a new column with None type
df.column =None#This will work only when the column is already present in the dataframe
N/A
?Réponses:
Si je comprends bien, le devoir devrait remplir:
la source
df
est vide, vous voudrez peut-être utiliserdf['new'] = pd.Series()
(voir ma réponse ci-dessous)Pour compléter la réponse de DSM et en s'appuyant sur cette question associée , je diviserais l'approche en deux cas:
Ajouter une seule colonne: attribuez simplement des valeurs vides aux nouvelles colonnes, par exemple
df['C'] = np.nan
Ajout de plusieurs colonnes: je suggère d'utiliser la
.reindex(columns=[...])
méthode des pandas pour ajouter les nouvelles colonnes à l'index des colonnes de la trame de données. Cela fonctionne également pour ajouter plusieurs nouvelles lignes avec.reindex(rows=[...])
. Notez que les versions plus récentes de Pandas (v> 0.20) vous permettent de spécifier unaxis
mot clé plutôt que de l'attribuer explicitement àcolumns
ourows
.Voici un exemple d'ajout de plusieurs colonnes:
ou
Vous pouvez également toujours concaténer une nouvelle trame de données (vide) avec la trame de données existante, mais cela ne me semble pas aussi pythonique :)
la source
version >= 0.20.0
supprimer le DataFrame et ajouter les nouvelles colonnes en tant que lignes. Exemple deversion < 0.20.0
travaux très bien sur la version Pandas0.24.1
, axis=1
dansversion = 0.25
. J'ai tenté de modifier votre réponse pour inclure la version mise à jour, mais j'ai été rejeté par @kenlukas et @il_raffa. J'espère que tout le monde a du mal à comprendre pourquoi votre réponse ne fonctionne pas pour eux - comme moi - tombe au moins sur ce commentaire.une solution encore plus simple est:
où "header_list" est une liste des en-têtes que vous souhaitez voir apparaître.
tout en-tête inclus dans la liste qui ne se trouve pas déjà dans la trame de données sera ajouté avec des cellules vides ci-dessous.
donc si
puis c et d seront ajoutés sous forme de colonnes avec des cellules vides
la source
À partir de
v0.16.0
,DF.assign()
pourrait être utilisé pour affecter de nouvelles colonnes ( simples / multiples ) à aDF
. Ces colonnes sont insérées par ordre alphabétique à la fin duDF
.Cela devient avantageux par rapport à une affectation simple dans les cas où vous souhaitez effectuer une série d'opérations chaînées directement sur la trame de données retournée.
Considérez le même
DF
exemple démontré par @DSM:Notez que cela retourne une copie avec toutes les colonnes précédentes ainsi que celles nouvellement créées. Pour que l'original
DF
soit modifié en conséquence, utilisez-le comme:df = df.assign(...)
car il ne prend pas en charge leinplace
fonctionnement actuellement.la source
J'aime:
Si vous avez une trame de données vide, cette solution garantit qu'aucune nouvelle ligne contenant uniquement
NaN
n'est ajoutée.Si
dtype
n'est pas spécifié, les nouvelles versions de Pandas produisent unDeprecationWarning
.la source
si vous souhaitez ajouter un nom de colonne à partir d'une liste
la source
La réponse de @ emunsing est vraiment cool pour ajouter plusieurs colonnes, mais je n'ai pas pu le faire fonctionner pour moi en python 2.7. Au lieu de cela, j'ai trouvé que cela fonctionne:
la source
Le code ci-dessous répond à la question "Comment ajouter n nombre de colonnes vides à ma trame de données existante". Afin de garder les solutions à des problèmes similaires en un seul endroit, je les ajoute ici.
Approche 1 (pour créer 64 colonnes supplémentaires avec des noms de colonne de 1 à 64)
Approche 2 (pour créer 64 colonnes supplémentaires avec des noms de colonne de 1 à 64)
la source
Tu peux faire
la source
On peut utiliser
df.insert(index_to_insert_at, column_header, init_value)
pour insérer une nouvelle colonne à un index spécifique.L'instruction ci-dessus insère une colonne vide après la première colonne.
la source