【问题标题】:How to calculate metrics for one particular column from other columns in Pandas?如何从 Pandas 中的其他列计算一个特定列的指标?
【发布时间】:2017-02-13 13:53:18
【问题描述】:

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

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 等。

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

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

【问题讨论】:

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


    【解决方案1】:

    您需要 groupbyaggregate 指标,例如 money_earned meansum 列,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

    【讨论】:

    • 感谢您的回答。这无疑为我指明了正确的方向。我想补充的一件事是,如果我需要一个自定义函数而不是使用一个或多个列进行计算的常规平均值、总和、长度,我的方法是什么?我基本上想一次计算每个指标,最后可能合并所有指标?
    • 我添加了自定义函数 - 每组的最短日期时间增加了 3 天。
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多