Super proste przypisanie kolumny
Ramka danych pandy jest implementowana jako uporządkowany zrzut kolumn.
Oznacza to, że __getitem__
[]
można użyć nie tylko do uzyskania określonej kolumny, ale również__setitem__
[] =
można też przypisać nową kolumnę.
Na przykład do tej ramki danych można dodać kolumnę, używając po prostu []
akcesorium
size name color
0 big rose red
1 small violet blue
2 small tulip red
3 small harebell blue
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
Pamiętaj, że działa to nawet wtedy, gdy indeks ramki danych jest wyłączony.
df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
[] = droga do zrobienia, ale uważaj!
Jeśli jednak masz pd.Series
i spróbuj przypisać go do ramki danych, w której indeksy są wyłączone, napotkasz problemy. Zobacz przykład:
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
Wynika to z faktu, że pd.Series
domyślnie indeks jest wyliczany od 0 do n. A [] =
metoda pand stara się być „inteligentna”
Co się właściwie dzieje?
Podczas korzystania z [] =
metody pandy cicho wykonują zewnętrzne połączenie lub scalanie zewnętrzne przy użyciu indeksu lewej ramki danych i indeksu prawej serii.df['column'] = series
Dygresja
To szybko powoduje dysonans poznawczy, ponieważ []=
metoda stara się robić wiele różnych rzeczy w zależności od danych wejściowych, a wyniku nie można przewidzieć, chyba że wiesz, jak działają pandy. Dlatego odradzałbym []=
podstawy kodu, ale podczas eksploracji danych w notatniku jest w porządku.
Obejście problemu
Jeśli masz pd.Series
i chcesz przypisać go od góry do dołu lub jeśli kodujesz kod produkcyjny i nie masz pewności co do kolejności indeksowania, warto zabezpieczyć się przed tego rodzaju problemami.
Możesz obniżyć pd.Series
do a np.ndarray
lub a list
, to załatwi sprawę.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values
lub
df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))
Ale to nie jest bardzo jednoznaczne.
Może przyjdzie jakiś koder i powie „Hej, to wygląda na zbędne, po prostu zoptymalizuję to”.
Wyraźny sposób
Ustawienie indeksu pd.Series
na indeks indeksu df
jest jawne.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)
Lub bardziej realistycznie, prawdopodobnie masz pd.Series
już dostępny.
protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index
3 no
2 no
1 no
0 yes
Można teraz przypisać
df['protected'] = protected_series
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
Alternatywny sposób z df.reset_index()
Ponieważ dysonans indeksu jest problemem, jeśli uważasz, że indeks ramki danych nie powinien dyktować rzeczy, możesz po prostu upuścić indeks, powinno to być szybsze, ale nie jest bardzo czyste, ponieważ Twoja funkcja prawdopodobnie wykonuje teraz dwie rzeczy.
df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
Uwaga na df.assign
Choć df.assign
stał się bardziej wyraźny, co robisz, to faktycznie ma te same problemy jak wyżej[]=
df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
Uważaj tylko, df.assign
aby twoja kolumna nie została wywołana self
. Spowoduje to błędy. To df.assign
śmierdzi , ponieważ w funkcji znajdują się tego rodzaju artefakty.
df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'
Możesz powiedzieć: „No cóż, wtedy po prostu nie self
użyję”. Ale kto wie, jak ta funkcja zmieni się w przyszłości, aby wspierać nowe argumenty. Być może nazwa kolumny będzie argumentem w nowej aktualizacji pand, powodując problemy z aktualizacją.