如何从Pandas中的其他列计算一个特定列的度量标准?

时间:2016-10-05 08:06:12

标签: python pandas optimization data-analysis data-science

我有一个数据集,我需要计算与数据集上每个人相关的指标。例如,我有一个数据框,其数据看起来像这样

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
...        

所以,我需要做的是计算每个人John, Jane, Suse等的指标,例如Time Since Last TaskAverage EarningsTotal EarningsTotal Tasks Done和等等。

真正的数据集很大(大约1M行,并且有更多列~50和~75K人),但这基本上解释了我需要做什么。

采用此数据框并进行这些计算的最有效方法是什么?我更喜欢使用pandas函数,但只要我可以将结果保存在另一个数据帧中,纯python也可以工作吗?

1 个答案:

答案 0 :(得分:3)

对于money_earned mean列,您需要groupbyaggregate指标,例如列sum task_venuesize等等:

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