Étant donné un DataFrame:
np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df
A B C
1 1.764052 0.400157 0.978738
2 2.240893 1.867558 -0.977278
3 0.950088 -0.151357 -0.103219
Quelle est la manière la plus simple d'ajouter une nouvelle colonne contenant une valeur constante, par exemple 0?
A B C new
1 1.764052 0.400157 0.978738 0
2 2.240893 1.867558 -0.977278 0
3 0.950088 -0.151357 -0.103219 0
C'est ma solution, mais je ne sais pas pourquoi cela met NaN dans la «nouvelle» colonne?
df['new'] = pd.Series([0 for x in range(len(df.index))])
A B C new
1 1.764052 0.400157 0.978738 0.0
2 2.240893 1.867558 -0.977278 0.0
3 0.950088 -0.151357 -0.103219 NaN
df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index)
.[0] * len(df.index)
df['new'] = 0
Réponses:
La raison pour laquelle cela met
NaN
dans une colonne est quedf.index
et leIndex
de votre objet de droite sont différents. @zach montre la bonne façon d'attribuer une nouvelle colonne de zéros. En général,pandas
essaie de faire autant d'alignement d'indices que possible. Un inconvénient est que lorsque les indices ne sont pas alignés, vous obtenezNaN
là où ils ne sont pas alignés. Jouez avec les méthodesreindex
etalign
pour acquérir une certaine intuition pour l'alignement fonctionne avec des objets qui ont des indices partiellement, totalement et non alignés - tous alignés. Par exemple, voici commentDataFrame.align()
fonctionne avec des indices partiellement alignés:la source
Affectation sur place très simple:
df['new'] = 0
Pour une modification sur place, effectuez une affectation directe. Cette affectation est diffusée par des pandas pour chaque ligne.
Remarque pour les colonnes d'objets
Si vous souhaitez ajouter une colonne de listes vides, voici mon conseil:
object
les colonnes sont de mauvaises nouvelles en termes de performances. Repensez la structure de vos données.Si vous devez stocker une colonne de listes, veillez à ne pas copier plusieurs fois la même référence.
Générer une copie:
df.assign(new=0)
Si vous avez besoin d'une copie à la place, utilisez
DataFrame.assign
:Et, si vous devez attribuer plusieurs de ces colonnes avec la même valeur, c'est aussi simple que,
Affectation de plusieurs colonnes
Enfin, si vous devez affecter plusieurs colonnes avec des valeurs différentes, vous pouvez utiliser
assign
avec un dictionnaire.la source
Avec les pandas modernes, vous pouvez simplement faire:
la source
Voici une autre doublure utilisant des lambdas (créez une colonne avec une valeur constante = 10)
avant
après
la source
df['newCol'] = 10
est également une doublure (et est plus rapide). Quel est l'avantage d'utiliser apply here?df['new'] = [[] for _ in range(len(df))]