![](/img/trans.png)
[英]Pandas: apply different custom functions to different columns when using groupby
[英]Apply different functions to different columns with a singe pandas groupby command
我的数据存储在df
中。 我每个group
有多个users
。 我想按组对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
的平均值,以及按group
分组的crop
的最小值和最大值,并为每个新列分配自定义名称。 所需的 output 应如下所示:
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
与字典结合使用。 是否有另一种方法可以在此过程中自定义每个列的名称?
尝试使用groupby().apply()
创建具有所需操作的 function :
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.