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.Seriesbir 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.Seriesve 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.SeriesBir np.ndarrayveya 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.Seriesolacak şekilde ayarlamak dfaçıktır.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)
Ya da daha gerçekçi bir şekilde, muhtemelen pd.Serieszaten 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.assignNe 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.assignsü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.