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.
object
kolommen 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 assign
gebruiken 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 NaN
in een kolom plaatst, is omdat df.index
en de Index
van uw rechterobject verschillend zijn . @zach toont de juiste manier om een nieuwe kolom met nullen toe te wijzen. Over het algemeen probeert pandas
de indexen zo goed mogelijk uit te lijnen. Een nadeel is dat wanneer indices niet zijn uitgelijnd, u NaN
krijgt waar ze nietzijn uitgelijnd. Speel wat met de methoden reindex
en align
om 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