我有一个数据集,我需要计算与数据集上每个人相关的指标。例如,我有一个数据框,其数据看起来像这样
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 Task
,Average Earnings
,Total Earnings
,Total Tasks Done
和等等。
真正的数据集很大(大约1M行,并且有更多列~50和~75K人),但这基本上解释了我需要做什么。
采用此数据框并进行这些计算的最有效方法是什么?我更喜欢使用pandas函数,但只要我可以将结果保存在另一个数据帧中,纯python也可以工作吗?
答案 0 :(得分:3)
对于money_earned
mean
列,您需要groupby
和aggregate
指标,例如列sum
task_venue
和size
等等:
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
。