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图像和真实空间残留图像。