2016-10-05 5 views
0

私は、データセットの各人物に関連するメトリックを計算する必要のあるデータセットを持っています。例えば、私はこのPandasの他の列から特定の列のメトリックを計算する方法は?

id name age task_date task_venue money_earned 
1 John 25 2016-05-01  A    100 
2 Jane 28 2016-05-12  A    120 
1 John 25 2016-05-03  B    150 
3 Suse 21 2016-05-30  B    200 
...   

のように見えるデータとデータフレームを持って、私は何をする必要があることは、このようなようにTime Since Last TaskAverage EarningsTotal EarningsTotal Tasks Doneおよびなどなど、一人一人John, Jane, Suseのメトリックを計算します。

実際のデータセットは大きく(約1M行で、〜50〜75K人の列があります)、これは本質的に私が何をする必要があるのか​​を説明しています。

このデータフレームを取得し、その計算を行う最も効率的な方法は何でしょうか?私はパンダの機能を使うのが好きですが、別のデータフレームで結果を保存できる限り、純粋なPythonも動作しますか?

答えて

3

あなたは上の列task_venuesizeなどのために、列money_earnedmeansum用などのgroupbyaggregate指標を必要とする:

print (df.groupby('name').agg({'money_earned':['mean', sum], 'task_venue': len})) 
    task_venue money_earned  
      len   mean sum 
name        
Jane   1   120 120 
John   2   125 250 
Suse   1   200 200 

Aggregation in pandas documentation


あなたが列にMultiIndexを得る集約した後、あなたはフラットそれlist comprehensionによって次のことができます。

df1 = df.groupby('name').agg({'money_earned':['mean', sum], 'task_venue': len}) 
df1.columns = ['_'.join(col) for col in df1.columns] 
print (df1) 
     task_venue_len money_earned_mean money_earned_sum 
name              
Jane    1    120    120 
John    2    125    250 
Suse    1    200    200 

集計カスタム関数の使用が必要な場合:

df.task_date = pd.to_datetime(df.task_date) 

def f(x): 
    #print (x) 
    return x.min() + pd.Timedelta('3d') 

df1 = df.groupby('name').agg({'money_earned':['mean',sum], 'task_venue': len, 'task_date':f}) 
df1.columns = ['_'.join(col) for col in df1.columns] 
print (df1) 
     task_venue_len task_date_f money_earned_mean money_earned_sum 
name                 
Jane    1 2016-05-15    120    120 
John    2 2016-05-04    125    250 
Suse    1 2016-06-02    200    200 

の場合集約が遅い大きいDataFrameを引き起こす、私はdask.dataframe.DataFrame.reductionを提案する。

+0

回答ありがとうございます。これは確かに正しい方向に私を指します。私が追加したいのは、通常の平均、合計、長さの代わりにカスタム関数が必要な場合、計算に1つ以上の列を使用することです。私のアプローチは何か?基本的には、一度に1つずつメトリックを計算し、最終的にはすべてをマージしたいと思うでしょうか? – sfactor

+0

私はカスタム関数を追加します - 3日はグループあたりの最小日時に追加されます。 – jezrael

関連する問題