2017-03-06 30 views
0

dfでカスタム関数を実行する必要があります。元のデータフレームとまったく同じ順序で値のベクトルを返すことができます元のdfにマージした後、新しい列だけを使用します)。Python pandas - 元のデータフレームにgroupby結果をマージする

私の関数はインデックス列と、そのリストを含む別の列にシリーズになり、単純なリストを、返却された瞬間、私は戻ってDFにその結果を組み合わせることができますどのように

下記参照??

いくつかの他の情報: 1.私の機能は、いくつかのビジネス・ロジックが含まれており、グループ内のすべてのcollsにアクセスする必要があるので、私は、私は戻り値の型としてシリーズを使用してみましたが、その後はTypeError serisを得たtransofrm 2を使用することができませんでした。名前はハッシュ可能である必要があります(私は復帰する前に、一連の名前を設定している場合でも) 3.私は、データフレームを使用しないようにしたい、その関数の結果として

import pandas as pd 
import random 

df=pd.DataFrame({"x":[1,1,2,1,2,2,1,3,1,2,3,2],"y":[random.random() for _ in range(12)]}) 

def myfun(rs,rownum=0): 
    if rownum >= len(rs): return [] 
    return [rs.y] + myfun(rs,rownum+1) 

q=df.groupby(df.x).apply(myfun) 

結果:

x 
1 [[0.199527553305, 0.652730337948], [0.19952755... 
2 [[0.58150463154, 0.882898367661], [0.581504631... 
3 [[0.793173748785, 0.29465803134], [0.793173748... 

更新:以下のスクリプトは私が望むことをします。私は、元のレコードセット内のインデックス値を保存し、その数で更新する場合、私はそれが動作することがわかっ唯一の方法は次のとおりです。次のコードは、あなたがちょうどより簡潔に、何をし

import pandas as pd 
import random 

df=pd.DataFrame({"x":[1,1,2,1,2,2,1,3,1,2,3,2],"y":[random.random() for _ in range(12)]}) 

def myfun(rs): 
    def myfun_loop(rs,rownum=0,idx=[],val=[]): 
     if rownum >= len(rs): 
      return (idx,val) 
     return myfun_loop(rs,rownum+1,idx+[rs.index[rownum]],val+[rownum]) 
    v=myfun_loop(rs) 
    return pd.DataFrame({"idx":v[0],"val":v[1]}) 


g=df.groupby(df.x) 
q=g.apply(lambda x:pd.DataFrame(myfun(x))) 
q.set_index(["idx"],inplace=True) 
df["val"]=None 
df.update(q) 
+0

正確に何を達成しようとしていますか?現在、あなたの関数は "単純なリスト"ではなく、同じ系列のリストを返します。 GroupByオブジェクトに適用すると、これは一連の一連のリスト( 'type(q)'、 'type(q [1])'、 'type(q [1] [0])')の出力を確認します。したがって、まず関数の出力を修正する必要があります。 –

+0

実際の例を使って投稿を更新しましたが、実装はかなり醜いです。より良い方法がありますか? – dkone

答えて

0

df["val"] = df.groupby(df.x).apply(
       lambda rs: pd.DataFrame(
        {"idx": rs.index, 
        "val": rs.reset_index().index}) 
      ).set_index(["idx"]) 

このように、この機能を実装するために再帰関数を定義する必要はありません。

+0

ここでは再帰が本当に賢明です。複雑な例からコードをコピーしていました。 だから私が正しく理解している場合、別の列のdfにdfを割り当てると、その下にインデックスが使用されます。それが私が見逃していた重要な詳細でした! – dkone

関連する問題