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?
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
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 :)
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
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.
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
@ 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'])
J'aime:
df['new'] = pd.Series()
Ceci s'assure qu'un df
avec zéro ligne reste avec zéro ligne.