Aşağıdaki veri çerçevesini düşünün:
A B C D
0 foo one 0.162003 0.087469
1 bar one -1.156319 -1.526272
2 foo two 0.833892 -1.666304
3 bar three -2.026673 -0.322057
4 foo two 0.411452 -0.954371
5 bar two 0.765878 -0.095968
6 foo one -0.654890 0.678091
7 foo three -1.789842 -1.130922
Aşağıdaki komutlar çalışır:
> df.groupby('A').apply(lambda x: (x['C'] - x['D']))
> df.groupby('A').apply(lambda x: (x['C'] - x['D']).mean())
ancak aşağıdakilerden hiçbiri işe yaramaz:
> df.groupby('A').transform(lambda x: (x['C'] - x['D']))
ValueError: could not broadcast input array from shape (5) into shape (5,3)
> df.groupby('A').transform(lambda x: (x['C'] - x['D']).mean())
TypeError: cannot concatenate a non-NDFrame object
Neden? Belgelerdeki örnek,transform
bir grubu çağırmanın bir kişinin satır bazında işlem gerçekleştirmesine izin verdiğini düşündürmektedir :
# Note that the following suggests row-wise operation (x.mean is the column mean)
zscore = lambda x: (x - x.mean()) / x.std()
transformed = ts.groupby(key).transform(zscore)
Başka bir deyişle, dönüşümün esasen belirli bir uygulama türü olduğunu düşündüm (toplanmayan). Nerede yanılıyorum?
Referans olarak, yukarıdaki orijinal veri çerçevesinin yapısı aşağıdadır:
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : randn(8), 'D' : randn(8)})
zscore
) belgelerdeki örneğe bakarsanız, transform
her birinin x
içinde bir öğe olduğunu varsayan group
ve ayrıca gruptaki öğe başına bir değer döndüren bir lambda işlevi alır . Neyi kaçırıyorum?
apply
tüm df'den geçer, ancak transform
her sütunu ayrı ayrı bir Seri olarak geçirir. 2) apply
herhangi bir şekil çıktısını döndürebilir (skaler / Seri / DataFrame / dizi / liste ...), oysa transform
grupla aynı uzunlukta bir dizi (1D Serisi / dizi / liste) döndürmelidir. Bu yüzden OP'nin buna ihtiyacı apply()
yok transform()
. Bu iyi bir soru çünkü doktor her iki farklılığı da net bir şekilde açıklamadı. ( apply/map/applymap
veya diğer şeyler arasındaki
transform
, bağımsız değişkenle bir sayı, satır veya aynı şekli döndürmelidir. bir sayı ise, sayı gruptaki tüm öğelere ayarlanır, bir satırsa gruptaki tüm satırlara yayınlanır. Kodunuzda lambda işlevi, gruba yayınlanamayan bir sütun döndürür.