Pandalar bir görünüm yerine kopya oluşturmak için hangi kuralları kullanır?


119

Pandas'ın bir veri çerçevesinden bir seçimin orijinal veri çerçevesinin bir kopyası veya orijinal üzerinde bir görünüm olduğuna karar verirken kullandığı kurallar konusunda kafam karıştı.

Örneğin, varsa

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))

queryA'nın bir kopya döndürdüğünü anlıyorum, böylece

foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40

orijinal veri çerçevesi üzerinde hiçbir etkisi olmayacaktır df. Skaler veya adlandırılmış dilimlerin bir görünüm döndürdüğünü de anlıyorum, böylece bunlara atamalar

df.iloc[3] = 70

veya

df.ix[1,'B':'E'] = 222

değişecek df. Ama daha karmaşık vakalar söz konusu olduğunda kayboldum. Örneğin,

df[df.C <= df.B] = 7654321

değişiklikler df, ama

df[df.C <= df.B].ix[:,'B':'E']

değil.

Pandaların kullandığı ve benim kaçırdığım basit bir kural var mı? Bu özel durumlarda neler oluyor; ve özellikle, belirli bir sorguyu karşılayan bir veri çerçevesindeki tüm değerleri (veya değerlerin bir alt kümesini) nasıl değiştirebilirim (yukarıdaki son örnekte yapmaya çalıştığım gibi)?


Not: Bu, bu soruyla aynı değildir ; ve belgeleri okudum , ama ondan aydınlanmadım. Ayrıca bu konuyla ilgili "İlgili" soruları da okudum, ancak Pandas'ın kullandığı basit kuralı ve bunu nasıl uygulayacağımı - örneğin - değerleri (veya bir değer alt kümesini) değiştirmeyi hâlâ özlüyorum belirli bir sorguyu karşılayan bir veri çerçevesinde.

Yanıtlar:


138

İşte kurallar, sonraki geçersiz kılma:

  • Tüm işlemler bir kopya oluşturur

  • Sağlanırsa inplace=True, yerinde değiştirilir; sadece bazı işlemler bunu destekler

  • Yerinde ayarlayan, örneğin .loc/.iloc/.iat/.atayarlayan bir dizinleyici .

  • Tek boyutlu bir nesneye giren bir dizinleyici, neredeyse her zaman bir görünümdür (bellek düzenine bağlı olarak, bunun güvenilir olmasının nedeni bu olmayabilir). Bu esas olarak verimlilik içindir. (yukarıdaki örnek içindir .query; bu , değerlendirildiği şekliyle her zaman bir kopya döndürür numexpr)

  • Birden çok tipli bir nesneye giren bir dizinleyici her zaman bir kopyadır.

Örneğiniz chained indexing

df[df.C <= df.B].loc[:,'B':'E']

çalışması garanti edilmez (ve bu nedenle bunu asla yapmamalısınız ).

Bunun yerine şunları yapın:

df.loc[df.C <= df.B, 'B':'E']

çünkü bu daha hızlı ve her zaman işe yarayacak

Zincirleme indeksleme, 2 ayrı python işlemidir ve bu nedenle pandalar tarafından güvenilir bir şekilde durdurulamaz (çoğu zaman a alırsınız SettingWithCopyWarning, ancak bu da% 100 tespit edilemez). Dev dokümanlar Eğer sivri, çok daha tam bir açıklama sunuyoruz.


3
.queryn numexpr tarafından değerlendirildiği için, HER ZAMAN yaptığı şey nedeniyle (bir görünüm değil) bir kopya döndürecektir. Bu yüzden bunu 'kurallara' ekleyeceğim
Jeff

3
Pandalar, bir görünümün oluşturulup oluşturulmadığını belirlemek için numpy'ye güvenir. Tek bir tip durumda (bir seri için 1-d, bir çerçeve için 2-d vb. Olabilir). numpy olabilir bir görünüm oluşturmak; ne dilimlediğinize bağlıdır; bazen bir manzaraya sahip olabilirsiniz ve bazen göremezsiniz. Pandalar bu gerçeğe hiç güvenmez, çünkü bir görüşün üretilip üretilmediği her zaman açık değildir. ancak loc ayar yaparken buna güvenmediğinden bu önemli değildir. Ancak, zincir dizine eklerken bu çok önemli (ve zincir indeksleme kötü böylece neden)
Jeff

3
Çok teşekkürler Jeff, cevabın çok faydalı. Bu konudaki kaynağınız / referansınız nedir?
Kamixave

4
O zaman önce, harika işin için teşekkürler! İkincisi, yeterince zamanınız varsa, belgedeki ana cevabınıza benzer bir paragraf eklemenin harika olacağını düşünüyorum.
Kamixave

2
kesinlikle dokümanları eklemek / revize etmek için bir istek alırdı. Göreyim seni.
Jeff
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.