计算组的平均值,同时保留对象类型的列

Posted

技术标签:

【中文标题】计算组的平均值,同时保留对象类型的列【英文标题】:calculate the mean of a group while keeping columns of type object 【发布时间】:2021-05-23 01:58:40 【问题描述】:

我有一个如下的数据框:

col1   col2 col3 col4   col5...
g1       x1   x2   x3     x4
g1       x5   x6   x7     x8
g2       y1   y2   y3     y4
g2       y5   y6   y7     y8
...

col1/col2 属于“object”类型,col3/col4/col5 属于“float”类型

我想先 groupby col1 然后计算 col3/col4/col5 的平均值,同时将 col2 保留在结果数据框中。通过“保持”,我只是指保持原样,甚至不计算平均值,这是不可能的,因为它是“对象”类型。每组col2每一行的实际值都是一样的,随便挑一个都行。

如果我这样天真地做:

df.groupby(["col1"]).mean().reset_index()

那么结果数据框将不会保留 col2,col2 消失了。也就是说,结果将如下所示:

col1           col3          col4          col5...
g1        (x2+y2)/2     (x3+y3)/2     (x4+y4)/2
g2        (x6+y6)/2     (x7+x8)/2     (x8+y8)/2

如何在保持 col2 不变的情况下计算 col3/col4/col5 的平均值?

【问题讨论】:

你怎么能“保留”col2?每一行都有不同的值,你会选择哪一个? 如果你想保留col2df.assign(**df.groupby("col1")['col3','col4','col5'].transform('mean'))的所有行,你可能需要转换 @Nick,“保持”我的意思是只保留每一行的值,不做任何修改 您的原始数据框有多行 g1g2 等,但输出只有 1。那么您如何确定输出行中的值是什么? 如果 col2 对于每个 col1 值都相同,您也可以按其分组 【参考方案1】:

有很多方法可以选择“col2”的值

根据需要生成平均值 将包加入要保留的列,选择第一个
s = 20
df = pd.DataFrame("col1":np.random.choice(["g1","g2","g3"],s),
             "col2":np.random.choice(["constant"],s),
             **f"coli+3":np.random.randint(1,10,s) for i in range(3))

df.groupby("col1").mean().join(df.groupby(["col1"])["col2"].first() ).reset_index(drop=True)

col3 col4 col5 col2
0 5.875 6.75 6.75 constant
1 7 5.33333 6 constant
2 4.77778 4.88889 3.66667 constant

【讨论】:

以上是关于计算组的平均值,同时保留对象类型的列的主要内容,如果未能解决你的问题,请参考以下文章

vrops制作基于自定义组的环境概览

mssql sqlserver 对不同群组对象进行聚合计算的方法分享

加快附近组的计算?

02 Python四大数据类型总结

通过按类型分组创建一个新列,新列的值是整个组的列值

在 Oracle 的 select 语句中使用对象类型