Kolom met constante waarde toevoegen aan panda’s dataframe

Gegeven een 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

Wat is de eenvoudigste manier om een ​​nieuwe kolom toe te voegen die een constante waarde bevat, bijvoorbeeld 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

Dit is mijn oplossing, maar ik weet niet waarom dit NaN in de ‘nieuwe’ kolom plaatst?

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

Antwoord 1, autoriteit 100%

Super eenvoudige toewijzing ter plaatse: df['new'] = 0

Voer voor wijzigingen ter plaatse directe toewijzing uit. Deze opdracht wordt voor elke rij door panda’s uitgezonden.

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

Opmerking voor objectkolommen

Als u een kolom met lege lijsten wilt toevoegen, volgt hier mijn advies:

  • Overweeg dit niet te doen. objectkolommen zijn slecht nieuws in termen van prestaties. Heroverweeg hoe uw gegevens zijn gestructureerd.
  • Overweeg om uw gegevens op te slaan in een schaarse gegevensstructuur. Meer informatie: schaarse gegevensstructuren
  • Als u een kolom met lijsten moet opslaan, zorg er dan voor dat u dezelfde referentie niet meerdere keren kopieert.

    # Wrong
    df['new'] = [[]] * len(df)
    # Right
    df['new'] = [[] for _ in range(len(df))]
    

Een kopie genereren: df.assign(new=0)

Als je in plaats daarvan een kopie nodig hebt, gebruik dan 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

En als u meerdere van dergelijke kolommen met dezelfde waarde moet toewijzen, is dit zo eenvoudig als,

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

Toewijzing van meerdere kolommen

Ten slotte, als u meerdere kolommen met verschillende waarden moet toewijzen, kunt u assigngebruiken met een woordenboek.

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

Antwoord 2, autoriteit 27%

Met moderne panda’s kun je gewoon het volgende doen:

df['new'] = 0

Antwoord 3, autoriteit 18%

De reden dat dit NaNin een kolom plaatst, is omdat df.indexen de Indexvan uw rechterobject verschillend zijn . @zach toont de juiste manier om een ​​nieuwe kolom met nullen toe te wijzen. Over het algemeen probeert pandasde indexen zo goed mogelijk uit te lijnen. Een nadeel is dat wanneer indices niet zijn uitgelijnd, u NaNkrijgt waar ze nietzijn uitgelijnd. Speel wat met de methoden reindexen alignom enige intuïtie te krijgen voor uitlijningswerken met objecten die gedeeltelijk, volledig en niet-uitgelijnde indices hebben. Hier is bijvoorbeeld hoe DataFrame.align()werkt met gedeeltelijk uitgelijnde indices:

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

Antwoord 4, autoriteit 7%

Hier is nog een oneliner die lambdas gebruikt(maak een kolom met constante waarde = 10)

df['newCol'] = df.apply(lambda x: 10, axis=1)

voor

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

na

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

Other episodes