Python Pandas 平均和总和冲突

Posted

技术标签:

【中文标题】Python Pandas 平均和总和冲突【英文标题】:Python Pandas Average and Sum conflicts 【发布时间】:2022-01-08 12:53:28 【问题描述】:

我有一张如下所示的表格:

平均行数和总行数的计算方式如下:

df1.loc["Average"] = df1.mean()
df1.loc["Total"] = df1.sum()

现在,我意识到这里的问题是平均计算正确,但总和也包括平均行,这不是我想要的。

理想情况下,我希望看到更像单个 .loc 行的东西,其中应用了 sum()

`columns` ['Enageable R', 'R Responses', 'R Response Rate', 'Engageable Q',
                                'Q Responses', 'Q Response Rate']

mean() 应用于columns ['R Response Rate', 'Q Response Rate']

所以我很想看到这样的东西:

Brand Engageable R R Responses Response Rate
Brand1 34 34 100.00%
Brand2 34 34 100.00%
Brand3 34 34 100.00%
Total 102 102 100.00%

【问题讨论】:

我认为你的目标输出与你的描述不匹配 @ZLi 我试图绕过 sum() 计算总和中包含的 mean() ,我认为这是一个冲突。你能推荐一个不同的描述吗? 【参考方案1】:

使用DataFrame.agg分别处理这两个函数,然后通过DataFrame.append添加新行:

df = df.append(df.agg(['sum','mean']).rename('sum':'Total','mean':'Average'))

如果只需要处理一些列:

cols = ['Enageable R', 'R Responses', 'R Response Rate', 'Engageable Q',
                    'Q Responses', 'Q Response Rate']

df = df.append(df[cols].agg(['sum','mean']).rename('sum':'Total','mean':'Average'))

【讨论】:

太棒了,这是我正在寻找的精简版。我最终创建了一个单独的 df,计算到第二个 df,然后附加回第一个,这比您的方法计算密集度更高,实现了更少的内存使用和更快的运行时间。谢谢!【参考方案2】:

使用副本:

df2 = df1.copy(deep=True)

df2["Average"] = df1.mean()
df2["Total"] = df1.sum()

编辑

您的帖子有点混乱。

df1["Total"] = df1.sum()
df1["Average"] = df1[['R Response Rate', 'Q Response Rate']].mean(axis=1)

【讨论】:

使用副本很浪费,第二次操作只排除total 所以df2["Average"]df1.loc["Average"] 之间存在巨大差异。您的建议是创建一个名为 Average 的列,我试图在其中创建一行。副本最终会出现在我现在所在的位置,Total 正在计算每一行包括平均行。 @Wilian 我认为你给了我一个好主意,我最终制作了一个空白 df2,取 df1.loc["Average"] 和 df1.loc["Total"] 然后附加df2 到 df1。复制方法不起作用的原因是因为总对所有行求和包括平均行,或者平均行平均所有行包括总行。例如,看看我的截图,看看R Response Rate。平均行显示 14.03% [(38.04% + 0+0+18.08)/4]。但 Total 行显示 70.15% [38.04% + 0+0+18.08+14.03]。我试图在总和计算中使用平均行来避免总计。 @GH,这是一个选项:df['Average'], df['Total']= [df.mean(axis=1),df.sum(axis=1)]。同时分配两列。【参考方案3】:

这是我发现的,感谢@Wilian 的推荐,但如果有更有效的方法,请告诉我。

所以我有一个 df1,并使用以下方法创建了一个空白 df2:

df2 = pd.DataFrame(columns=['Enageable R', 'R Responses', 'R Response Rate', 'Engageable Q',
                        'Q Responses', 'Q Response Rate'])

然后我用 df2 填充:

df2.loc["Average"] = df1.mean()
df2.loc["Total"] = df1.sum()

然后我将 df2 附加到 df1

df1 = df1.append(df2)

创建了以下内容:

所以总和和平均列在其他行的计算中不包括彼此。

【讨论】:

以上是关于Python Pandas 平均和总和冲突的主要内容,如果未能解决你的问题,请参考以下文章

Python/Pandas - 结合 groupby 平均值和最小值

python 通过衍射图并生成总和图像,平均图像,stdev图像和真实空间残留图像。

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)

将组平均值分配给 python/pandas 中的每一行

将组平均值分配给python / pandas中的每一行

Python Pandas Dataframe - 基于条件的分组和平均值