web-dev-qa-db-fra.com

Ajouter une colonne à valeur constante à la base de données pandas

Je ne sais pas pourquoi cela place NaN dans la "nouvelle" colonne?

df['new'] = pd.Series([0 for x in range(len(df.index))])
60
yemu

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
16
Phillip Cloud

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
1
Grant Shannon

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
0
coldspeed