web-dev-qa-db-fra.com

Comment ajouter une colonne vide à un dataframe?

Quel est le moyen le plus simple d’ajouter une colonne vide à un objet pandas DataFrame? Le meilleur que je suis tombé sur est quelque chose comme

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

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

189
kjo

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
312
DSM

Pour ajouter à la réponse de DSM et s'appuyer sur cette question associée , je découpais l'approche en deux cas:

  • Ajouter une seule colonne: Assignez simplement des valeurs vides aux nouvelles colonnes, par exemple. df['C'] = np.nan

  • Ajout de plusieurs colonnes: Je suggérerais d'utiliser la .reindex(columns=[...])méthode des pandas pour ajouter les nouvelles colonnes à l'index de colonne du cadre de données. Cela fonctionne également pour ajouter plusieurs nouvelles lignes.

Voici un exemple d’ajout de plusieurs colonnes:

mydf = mydf.reindex( mydf.columns.tolist() + ['newcol1','newcol2'])  # version >= 0.20.0

ou

mydf = mydf.reindex( columns = mydf.columns.tolist() + ['newcol1','newcol2'])  # version < 0.20.0

Vous pouvez également toujours concaténer un nouveau cadre de données (vide) avec le cadre de données existant, mais cela ne me semble pas aussi pythonique :)

33
emunsing

une solution encore plus simple est:

df = df.reindex(columns = header_list)                

où "liste_en-tête" est une liste des en-têtes que vous voulez voir apparaître.

tout en-tête inclus dans la liste qui ne se trouve pas déjà dans le cadre de données sera ajouté avec les cellules vides ci-dessous.

donc si

header_list = ['a','b','c', 'd']

alors c et d seront ajoutés sous forme de colonnes avec des cellules vides

29
liana

En commençant par v0.16.0, DF.assign() peut être utilisé pour affecter de nouvelles colonnes ( single/multiple ) à un DF. Ces colonnes sont insérées dans l'ordre alphabétique à la fin de la DF.

Cela devient avantageux par rapport à une simple affectation dans les cas où vous souhaitez effectuer une série d'opérations chaînées directement sur la trame de données renvoyée.

Prenons le même exemple DF 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 ceci retourne une copie avec toutes les colonnes précédentes avec celles nouvellement créées. Pour que le DF original soit modifié en conséquence, utilisez-le comme suit: df = df.assign(...) car il ne prend pas en charge l'opération inplace pour le moment.

16
Nickil Maveli

si vous voulez 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
4
Joy Mazumder

@ emunsing's answer est vraiment cool pour ajouter plusieurs colonnes, mais je ne pouvais pas le faire fonctionner pour moi dans python 2.7. Au lieu de cela, j'ai trouvé ceci fonctionne:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
4
jua-kali

J'aime:

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

Ceci s'assure qu'un df avec zéro ligne reste avec zéro ligne.

0
Carsten