使用singe pandas groupby命令将不同的函数应用于不同的列

时间:2019-10-10 15:25:25

标签: python pandas group-by

我的数据存储在df中。每个users我有多个group。我想按dfgroup进行分组,并将不同的功能应用于不同的列。所不同的是,我想在此过程中为新列分配自定义名称。

np.random.seed(123)
df = pd.DataFrame({"user":range(4),"group":[1,1,2,2],"crop":["2018-01-01","2018-01-01","2018-03-01","2018-03-01"],
                   "score":np.random.randint(400,1000,4)})
df["crop"] = pd.to_datetime(df["crop"])
print(df)
   user  group        crop  score
0     0      1  2018-01-01    910
1     1      1  2018-01-01    765
2     2      2  2018-03-01    782
3     3      2  2018-03-01    722

我想获取score的平均值,并按crop 分组的group的最小值和最大值为每个新列分配自定义名称。所需的输出应如下所示:

  group  mean_score    min_crop    max_crop
0     1       837.5  2018-01-01  2018-01-01
1     2       752.0  2018-03-01  2018-03-01

我不知道如何在Python的单行代码中执行此操作。在R中,我将使用data.table并获得以下信息:

df[, list(mean_score = mean(score),
          max_crop   = max(crop),
          min_crop   = min(crop)), by = group]

我知道我可以对数据进行分组,并结合使用.agg和字典。有没有其他方法可以在此过程中自定义每个列的名称?

1 个答案:

答案 0 :(得分:1)

尝试使用groupby().apply()创建具有所需操作的函数:

def f(x):
    d = {}
    d['mean_score'] = x['score'].mean()
    d['min_crop'] = x['crop'].min()
    d['max_crop'] = x['crop'].max()
    return pd.Series(d, index=['mean_score', 'min_crop', 'max_crop'])

data = df.groupby('group').apply(f)
相关问题