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

df['foo'] = df.apply(lambda _: '', axis=1)

Existe-t-il une méthode moins perverse?

kjo
la source
2
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  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
DSM
la source
2
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.

Voici un exemple d'ajout de plusieurs colonnes:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

ou

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 :)

démunir
la source
3
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

liane
la source
2
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]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

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.

Nickil Maveli
la source
Quel est ce type de données pour C? J'essaie d'ajouter en parcourant une liste de chaînes. Mais il ne l'utilise pas.
eleijonmarck
12

J'aime:

df['new'] = pd.Series(dtype='your_required_dtype')

Si vous avez une trame de données vide, cette solution garantit qu'aucune nouvelle ligne contenant uniquement NaNn'est ajoutée.

Si dtypen'est pas spécifié, les nouvelles versions de Pandas produisent un DeprecationWarning.

Carsten
la source
5

si vous souhaitez ajouter un nom de colonne à partir d'une liste

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan
Joy Mazumder
la source
4

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:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
cas particulier
la source
1

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.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')
moys
la source
1

Tu peux faire

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 
Bharath_Raja
la source
1

On peut utiliser df.insert(index_to_insert_at, column_header, init_value)pour insérer une nouvelle colonne à un index spécifique.

cost_tbl.insert(1, "col_name", "") 

L'instruction ci-dessus insère une colonne vide après la première colonne.

Usman Ahmad
la source