Süper basit sütun ataması
Bir panda veri çerçevesi, sütunların sıralı bir diktesi olarak uygulanır.
Bu, __getitem__
[]
yalnızca belirli bir sütunu almak için değil, aynı __setitem__
[] =
zamanda yeni bir sütun atamak için de kullanılabileceği anlamına gelir .
Örneğin, bu veri çerçevesinde yalnızca []
erişimciyi kullanarak bir sütun eklenebilir
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
Veri çerçevesinin dizini kapalı olsa bile bunun işe yaradığını unutmayın.
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
[] = gidilecek yol ama dikkat edin!
Ancak, pd.Series
bir dizininiz varsa ve bunu dizinlerin kapalı olduğu bir veri çerçevesine atamaya çalışırsanız, sorun yaşarsınız. Örneğe bakın:
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
Bunun nedeni pd.Series
, a'nın varsayılan olarak 0'dan n'ye kadar numaralandırılmış bir dizinine sahip olmasıdır. Ve panda [] =
yöntemi "akıllı" olmaya çalışıyor
Aslında neler oluyor.
[] =
Metodu kullandığınızda pandalar sessizce bir sol birleşim veya dış birleştirme işlemini sol el veri çerçevesinin dizinini ve sağ el serisinin dizinini kullanarak gerçekleştiriyor.df['column'] = series
Kenar notu
Bu []=
yöntem hızlı bir şekilde bilişsel uyumsuzluğa neden olur, çünkü yöntem girdiye bağlı olarak birçok farklı şey yapmaya çalışır ve pandaların nasıl çalıştığını bilmediğiniz sürece sonuç tahmin edilemez . Bu nedenle []=
kod bazında karşı tavsiye ediyorum , ama bir dizüstü bilgisayardaki verileri araştırırken, sorun değil.
Sorunun etrafından dolaşmak
Eğer varsa pd.Series
ve yukarıdan aşağıya atanmasını istiyorsanız veya üretken kod kodluyorsanız ve dizin sırasından emin değilseniz, bu tür bir sorun için korunmaya değer.
pd.Series
Bir np.ndarray
veya a 'ya mahsup olabilirsiniz list
, bu hile yapar.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values
veya
df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))
Ama bu çok açık değil.
Bazı kodlayıcı gelip "Hey, bu gereksiz görünüyor, bunu optimize edeceğim" diyebilir.
Açık yol
'Nin indeksini' nin endeksi pd.Series
olacak şekilde ayarlamak df
açıktır.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)
Ya da daha gerçekçi bir şekilde, muhtemelen pd.Series
zaten hazırsınız demektir.
protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index
3 no
2 no
1 no
0 yes
Şimdi atanabilir
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
İle alternatif bir yol df.reset_index()
Dizin uyumsuzluğu sorun olduğundan, veri çerçevesinin dizininin bir şey dikte etmemesi gerektiğini düşünüyorsanız, dizini düşürebilirsiniz , bu daha hızlı olmalıdır, ancak çok temiz değil, çünkü işleviniz muhtemelen iki şey yapıyor.
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
Hakkında not df.assign
df.assign
Ne yaptığınızı daha açık hale getirirken , aslında yukarıdakiyle aynı sorunlara sahiptir.[]=
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
Sadece df.assign
sütununuzun çağrılmadığına dikkat edin self
. Hatalara neden olur. Bu df.assign
kokuyor , çünkü işlevde bu tür eserler var.
df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'
"Peki, o zaman kullanmayacağım" diyebilirsiniz self
. Ancak yeni argümanları desteklemek için bu işlevin gelecekte nasıl değişeceğini kim bilebilir. Belki sütun adınız yeni bir panda güncellemesinde bir argüman olacak ve yükseltme ile ilgili sorunlara neden olacaktır.