Uzun zamandır işimde kullanmış olduğum bir toplama işlevini kullanıyorum. Buradaki fikir, eğer işleve geçirilen dizinin uzunluğu 1 ise (yani, grubun sadece bir gözlemi varsa), o zaman gözlemler döndürülür. Dizinin uzunluğu birinden büyükse, gözlemler bir listede döndürülür.Pandas Groupby Agg İşlevi Azaltmıyor
Bu, bazıları için garip gelebilir, ancak bu bir X, Y problemi değil, bu soruyla alakalı olmayan bir şeyi yapmak için iyi bir nedenim var.
def MakeList(x):
""" This function is used to aggregate data that needs to be kept distinc within multi day
observations for later use and transformation. It makes a list of the data and if the list is of length 1
then there is only one line/day observation in that group so the single element of the list is returned.
If the list is longer than one then there are multiple line/day observations and the list itself is
returned."""
L = x.tolist()
if len(L) > 1:
return L
else:
return L[0]
Şimdi bazı nedenlerden dolayı, ben I üzerinde çalışıyorum geçerli veri seti ile olsun bir ValueError fonksiyonu azaltmak olmadığını belirten:
Bu
ben kullanıyorum fonksiyonudur. İşte bazı test verisi ve kalan kullanıyorum adım: Bu hata ayıklamak çalışırkenimport pandas as pd
DF = pd.DataFrame({'date': ['2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02'],
'line_code': ['401101',
'401101',
'401102',
'401103',
'401104',
'401105',
'401105',
'401106',
'401106',
'401107'],
's.m.v.': [ 7.760,
25.564,
25.564,
9.550,
4.870,
7.760,
25.564,
5.282,
25.564,
5.282]})
DFGrouped = DF.groupby(['date', 'line_code'], as_index = False)
DF_Agg = DFGrouped.agg({'s.m.v.' : MakeList})
, ben çıkış gibiydi print L
ve print x.index
ve etkisiyle bir baskı beyanı koymak şöyle:
[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')
[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')
Bazı nedenlerden dolayı agg
Serisi'ni iki kez işleve geçiriyormuş gibi görünüyor. Bildiğim kadarıyla bu hiç de normal değil ve muhtemelen fonksiyonumun azalmamasının nedeni.
böyle bir işlev yazarsanız:
def test_func(x):
print x.index
return x.iloc[0]
Bu sorun olmadan çalışır ve baskı ifadeler şunlardır: Her grubun yalnızca bir kez aktarılmaya devam ettiğini gösterir
DF_Agg = DFGrouped.agg({'s.m.v.' : test_func})
Int64Index([0, 1], dtype='int64')
Int64Index([2], dtype='int64')
Int64Index([3], dtype='int64')
Int64Index([4], dtype='int64')
Int64Index([5, 6], dtype='int64')
Int64Index([7, 8], dtype='int64')
Int64Index([9], dtype='int64')
Dizinin işlevi.
Bu sorunun neden başarısız olduğunu anlamama yardımcı olan var mı? Neden
Bu sizin işlevi bazen bir liste ve bazen tek bir değeri verirse farklı dtypes bu iki durum için kullanılacak beri pandalar, karışır olması mümkündür. Bu şekilde yapmamak muhtemelen daha iyidir. İki kez çağıran davranış, "burada" (http://stackoverflow.com/questions/21390035/python-pandas-groupby-object-apply-method-duplicates-first-group) açıklanan sorunla ilgili olabilir. : Fonksiyonun mevcut veriyi değiştirip değiştirmediğini kontrol etmek için fonksiyonu ilk grupta iki kez çağırır. – BrenBarn
Hmmm .... Belki nesne dtype olarak ayarlamayı denemeliyim. –
En garip olan şey, bu kodu her zaman sorun olmaksızın yeniden kullanıyorum. Uyguladığım ve farklı veri paketlerini geçirdiğimi biliyorum, ki bu, devam eden baskı ifadelerinden emin olmak için oldukça zordur, ancak agh oldukça basittir. Hatayı yeniden oluşturdunuz mu? –