2016-12-05 1 views
0

TL基を表す既存パンダのデータフレームに結果を変換goupby追加; DRは - 私はデータフレームIがグループを有するよう各行は

()DataFrameGroupBy.stdとしての機能の動作を模倣します。私は(例えば、これらのグループの平均値とstdとして)

を、各グループを代表する1行を取り、次いで得られたデータフレームに、これらのグループに関する追加の統計情報を追加したい は、ここで私が何を意味するかの例です:

df = pandas.DataFrame({"Amount": [numpy.nan,0,numpy.nan,0,0,100,200,50,0,numpy.nan,numpy.nan,100,200,100,0], 
          "Id": [0,1,1,1,1,2,2,2,2,2,2,2,2,2,2], 
          "Date": pandas.to_datetime(["2011-11-02","NA","2011-11-03","2011-11-04", 
                 "2011-11-05","NA","2011-11-04","2011-11-04", 
                "2011-11-06","2011-11-06","2011-11-06","2011-11-06", 
                "2011-11-08","2011-11-08","2011-11-08"],errors='coerce')}) 

    g = df.groupby("Id") 
    f = g.first() 
    f["std"] = g.Amount.std() 

さて、これは動作します - しかし、のは、私は0を無視する特別なSTDを、したいとしましょう、と一度だけ、それぞれ固有の値について:

def get_unique_std(group): 
    vals = group.unique() 
    vals = vals[vals>0] 
    return vals.std() if vals.shape[0] > 1 else 0 

私が使用している場合

f["std"] = g.Amount.transform(get_unique_std) 

私は(またなど最大などの他の機能のための)ゼロ...

を取得しかし、私はこのようにそれを行う場合:のみ、

std = g.Amount.transform(get_unique_std) 

私は、正しい結果を得ますもうグループ化されていない...私はグループの表す行を取る前に、私は(この場合のDFで)、元データフレームの列にこれらのすべてを計算することができますね。

df["std"] = g.Amount.transform(get_unique_std) 
# regroup again the modified df 
g = df.groupby("Id") 
f = g.first() 

しかし、それは無駄になります私の同じグループに対応する多くの行が同じ値を取得するので、dfを2回グループ化する必要があります。これらの統計を計算するために1回、表現する行を取得するために2回目にしてください...

So最初に述べたように、私はDataFrameGroupBy.std()の動作をどのように模倣できるのだろうかと思います。

g.Amount.agg(get_unique_std) 

あなたはまた、辞書を渡すことができ、列などの各キーを取得:

答えて

1

は、私はあなたがこのようにカスタム関数を渡すと、グループ化された結果を得ることができますDataFrameGroupBy.agg()

を探しているかもしれないと思います:

g.Amount.agg({'my_std': get_unique_std, 'numpy_std': pandas.np.std})