2017-06-28 7 views
5

私は車両座標のパンダデータフレームを持っています(複数の車両から複数の日に)。各車両と毎日のために、アルゴリズムを適用するか、または特定の基準を満たしていない場合は、データセットから完全に除外するかの2つを行います。私はdf.groupby('vehicle_id', 'day')を使用して、.apply(algorithm)またはalgorithmconditionは、データフレームに取る関数です.filter(condition)これをacheiveする宣言的スタイルでパンダデータを処理する

命令的な何かを見て全体のことを目標に、グループをループとは対照的に、私は、宣言的なスタイルで書き出されるために(複数.apply.filterの手順が必要)私のデータセットの完全な処理をしたいと思います以下のような:もちろん

df.group_by('vehicle_id', 'day').apply(algorithm1).filter(condition1).apply(algorithm2).filter(condition2)

、上記のコードは.apply()以来、間違っていると、新しいデータフレームを返す.filter()、これはまさに私の問題です。彼らはすべてのデータを単一のデータフレームに戻します。私は.groupby('vehicle_id', 'day')を連続して適用しています。

同じ列で何度もグループ化する必要なく、これを書くことができますか?

答えて

0

applyが(背景には、洗練された最適化が存在しないという意味)とにかくforループを使用しているので、私は、forループを実際に使用することをお勧め:

arr = [] 
for key, dfg in df.groupby(['vehicle_id', 'day']): 
    dfg = dfg.do_stuff1() # Perform all needed operations 
    dfg = do_stuff2(dfg) # 
    arr.append(dfg) 

result = pd.concat(arr) 

代替の全てを実行する関数を作成することです適用され、与えられたデータフレームに順次フィルタリングし、それに適用されます/シングルGROUPBYをマップ:両方のオプションで

def all_operations(dfg): 
    # Do stuff 
    return result_df 

result = df.group_by(['vehicle_id', 'day']).apply(all_operations) 

、このような場合は、空のデータフレームをフィルタから返された場合に対処する必要がありますケースが存在する。

関連する問題