2017-02-27 5 views
0

2列にグループ化されたパンダDataFrameと、グループ化された各行の集合から値のタプルを計算するカスタム関数があります。 元のグループインデックスでインデックスされたデータフレームで結果を収集しようとしています。 apply()を使用すると、正確なインデックスを持つSeriesが得られますが、値はタプルの形になります。各グループのラベルによってインデックスされた結果をデータフレームにするために、関数をどのように書く必要がありますか?集計された値をデータフレームとして返す

ここでは、チュートリアルのデータフレームに基づく例を示します。

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
          'foo', 'bar', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 
          'two', 'two', 'one', 'three'], 
        'C' : 1, 
        'D' : range(0, 8) }) 
groups = df.groupby(("A", "B")) 

def myfunc(grp): 
    return len(grp), sum(grp["D"]) 

result = groups.apply(myfunc) 

print(type(result)) 
print(result) 

出力:

<class 'pandas.core.series.Series'> 
A B  
bar one  (1, 4) 
    three  (1, 8) 
    two  (1, 12) 
foo one  (2, 16) 
    three (1, 16) 
    two  (2, 16) 

Iは、例えば、結果はデー​​タフレームになりたいです「size」と「sum」という名前の列があります。私の集計機能はどのように見えるのですか?また、結果の各行に対して個々のラベル(列AB)にアクセスするために何をする必要がありますか?

答えて

2

あなたの集計機能はパンダシリーズを返す必要があります。この場合、全体的なGROUPBY-適用するには、パンダのデータフレームになります。ここで辞書を使用して

def myfunc(grp): 
    return pd.Series({"size": len(grp), "sum": sum(grp["D"])}) 

自動的にあなたの最終的な結果のデータフレームにラベルを付けます。

+0

戻って試してみてください! –

1
def myfunc(grp): 
    return pd.Series([len(grp), sum(grp["D"])]) 

辞書はクールですシリーズ

+1

ありがとうございました、シリーズを構築することは欠けていた成分でした。私はあなたに両方をupvotedしかし、それはより多くの機能が含まれているので、@ pansenの答えを受け入れた。 – alexis

関連する問題