Je ne sais pas pourquoi cela place NaN dans la "nouvelle" colonne?
df['new'] = pd.Series([0 for x in range(len(df.index))])
Cela place NaN
dans une colonne parce que df.index
et la Index
de votre objet de droite sont différents. @zach montre comment attribuer une nouvelle colonne de zéros. En général, pandas
essaie d'aligner autant que possible les index. Un inconvénient est que lorsque les index ne sont pas alignés, vous obtenez NaN
partout où ils ne sont pas alignés. Jouez avec les méthodes reindex
et align
pour acquérir une certaine intuition en matière d'alignement avec des objets dotés d'indices partiellement, totalement et non alignés. Par exemple, voici comment DataFrame.align()
fonctionne avec des index partiellement alignés:
In [7]: from pandas import DataFrame
In [8]: from numpy.random import randint
In [9]: df = DataFrame({'a': randint(3, size=10)})
In [10]:
In [10]: df
Out[10]:
a
0 0
1 2
2 0
3 1
4 0
5 0
6 0
7 0
8 0
9 0
In [11]: s = df.a[:5]
In [12]: dfa, sa = df.align(s, axis=0)
In [13]: dfa
Out[13]:
a
0 0
1 2
2 0
3 1
4 0
5 0
6 0
7 0
8 0
9 0
In [14]: sa
Out[14]:
0 0
1 2
2 0
3 1
4 0
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
Name: a, dtype: float64
Voici un autre liner utilisant lambdas (créer une colonne avec une valeur constante = 10)
df['newCol'] = df.apply(lambda x: 10, axis=1)
avant
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
après
df
A B C newCol
1 1.764052 0.400157 0.978738 10
2 2.240893 1.867558 -0.977278 10
3 0.950088 -0.151357 -0.103219 10
Pour une modification sur place, effectuez une affectation directe. Cette assignation est diffusée par pandas pour chaque ligne.
df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
df
A B C
0 x x x
1 x x x
2 x x x
3 x x x
df['new'] = 'y'
# Same as,
# df.loc[:, 'new'] = 'y'
df
A B C new
0 x x x y
1 x x x y
2 x x x y
3 x x x y
Si vous avez besoin d’une copie à la place, utilisez DataFrame.assign
:
df.assign(new='y')
A B C new
0 x x x y
1 x x x y
2 x x x y
3 x x x y
Et, si vous devez affecter plusieurs colonnes de ce type avec la même valeur, cela est aussi simple que,
c = ['new1', 'new2', ...]
df.assign(**dict.fromkeys(c, 'y'))
A B C new1 new2
0 x x x y y
1 x x x y y
2 x x x y y
3 x x x y y
Enfin, si vous devez affecter plusieurs colonnes avec des valeurs différentes, vous pouvez utiliser assign
avec un dictionnaire.
c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)
A B C new1 new2 new3
0 x x x w y z
1 x x x w y z
2 x x x w y z
3 x x x w y z