2012-12-13 17 views
15

Başka bir panda sorunu var.pandas 'dönüşümü, groupby çıktısını sıralamada çalışmıyor

varsayalım Ben ipuçları hakkında biraz bilgi vardır: Veri Analizi ve Pandas hakkında Okuma Wes McKinney mükemmel kitabı

, ben işe gerektiğini düşündüm aşağıdaki şeyi karşılaştı.

In [119]: 

tips.head() 
Out[119]: 
total_bill tip  sex  smoker day time size tip_pct 
0 16.99 1.01 Female False Sun  Dinner 2 0.059447 
1 10.34 1.66 Male False Sun  Dinner 3 0.160542 
2 21.01 3.50 Male False Sun  Dinner 3 0.166587 
3 23.68 3.31 Male False Sun  Dinner 2 0.139780 
4 24.59 3.61 Female False Sun  Dinner 4 0.146808 

ve ben yani içenler ve içmeyenler için tip_pct ayrı, toplam fatura ile ilgili olarak beş büyük ipuçları bilmek istiyorum. Böyle aynısını yapmaya dönüşümü panda kullanmak istedi sonra

def top(df, n=5, column='tip_pct'): 
    return df.sort_index(by=column)[-n:] 

In [101]: 

tips.groupby('smoker').apply(top) 
Out[101]: 
      total_bill tip sex smoker day time size tip_pct 
smoker         
False 88 24.71 5.85 Male False Thur Lunch 2 0.236746 
185 20.69 5.00 Male False Sun  Dinner 5 0.241663 
51 10.29 2.60 Female False Sun  Dinner 2 0.252672 
149 7.51 2.00 Male False Thur Lunch 2 0.266312 
232 11.61 3.39 Male False Sat  Dinner 2 0.291990 

True 109 14.31 4.00 Female True Sat  Dinner 2 0.279525 
183 23.17 6.50 Male True Sun  Dinner 4 0.280535 
67 3.07 1.00 Female True Sat  Dinner 1 0.325733 
178 9.60 4.00 Female True Sun  Dinner 2 0.416667 
172 7.25 5.15 Male True Sun  Dinner 2 0.710345 
yeterince iyi

ama: Yani bu işleri

def top_all(df): 
    return df.sort_index(by='tip_pct') 

tips.groupby('smoker').transform(top_all) 

ama bunun yerine bu olsun:

TypeError: Transform function invalid for data types 

Niye ya? Dönüşümün, girdi olarak kabul ettiği aynı boyutlarda bir dizi döndürmeyi gerektirdiğini biliyorum, bu yüzden, bu gereksinimle, kendi boyutlarını değiştirmeden, orijinal DataFrame'in her iki dilimini (sigara içenler ve sigara içmeyenler) sıraya koyacağımı düşündüm. . Herkes neden başarısız olduğunu açıklayabilir mi?

cevap

36

transform o kadar iyi belgelenmiş değildir, ancak çalışmasının biçimi, dönüşüm işlevinin aktarıldığı şeyin, tüm veri grubu olarak değil, tek bir grubun tek bir sütunu olduğu şeklindedir. Yapmaya çalıştığınız şeylerin gerçekten işe yaradığını sanmıyorum ve apply ile çözümünüz gayet iyi.

tips.groupby('smoker').transform(func). İki grup olacak, onları grup1 ve grup2 olarak adlandırın. Dönüşüm, func(group1) ve func(group2)'u çağırmaz. Bunun yerine, func(group1['total_bill']), sonra func(group1['tip']), vb. Ve sonra func(group2['total_bill']), func(group2['total_bill']).

>>> print d 
    A B C 
0 -2 5 4 
1 1 -1 2 
2 0 2 1 
3 -3 1 2 
4 5 0 2 
>>> def foo(df): 
...  print ">>>" 
...  print df 
...  print "<<<" 
...  return df 
>>> print d.groupby('C').transform(foo) 
>>> 
2 0 
Name: A 
<<< 
>>> 
2 2 
Name: B 
<<< 
>>> 
1 1 
3 -3 
4 5 
Name: A 
<<< 
>>> 
1 -1 
3 1 
4 0 
Name: B 
# etc. 

için foo birinci orijinal veri çerçevesinin C = 1 grubun sadece bir sütun, bu grubun daha sonra B sütununda, daha sonra bir sütun ile adlandırılır görebilirsiniz: Bir örnek C = 2 grup, vb.

Bu, dönüşümün ne için olduğunu düşünürseniz mantıklıdır. Gruplarda dönüşüm fonksiyonları uygulamak içindir. Ancak genel olarak, bu işlevler tüm gruba uygulandığında, yalnızca belirli bir sütuna göre anlam ifade etmez. Örneğin, panda dokümanlarındaki örnek, transform kullanarak z standardizasyonu hakkındadır. Yaş ve kilo için sütunları olan bir DataFrame'iniz varsa, bu değişkenlerin genel ortalamasına göre z-standardize etmek mantıklı olmaz. Bazıları yaşları ve bazıları ağırlık olan bir grup sayının genel ortalamasını almak için hiçbir şey ifade etmiyor. Yaşın ortalama ağırlığa göre ortalama yaş ve ağırlığa göre z-standardize edilmesi gerekir, bu da her bir sütun için ayrı ayrı dönüştürmek istediğiniz anlamına gelir.

Temel olarak, burada dönüştürmeyi kullanmanız gerekmez. apply burada uygun işlevdir, çünkü apply tek bir DataFrame olarak her grupta gerçekten çalışır, transform ise her grubun her sütununda çalışır.

+1

Mükemmel cevap. Çok teşekkürler! –

+6

Dönüştürme neden bu kadar zayıf belgeleniyor? Beni deli ediyor.Eğer baskı kayıtlarını sizin fonksiyonlarınıza koyduğunuzda (aslında nasıl çalıştığını bilmemekle birlikte) oldukça doğru bir şekilde çalıştığınızı düşünmüyorum; dönüşümün aslında dizileri ve veri çerçeveleri olarak sütunları geçtiğini açıkça görüyoruz. Gerçekten garip ve sahnelerin ardında neler olup bittiğini tam olarak anlamak istiyorum ancak dönüşümün gerçekte nasıl uygulandığı hakkında hiçbir bilgi bulamıyor. –