我的数据存储在df
中。每个users
我有多个group
。我想按df
对group
进行分组,并将不同的功能应用于不同的列。所不同的是,我想在此过程中为新列分配自定义名称。
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
和字典。有没有其他方法可以在此过程中自定义每个列的名称?
答案 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)