如何解决计算“均值”的差异

Posted

技术标签:

【中文标题】如何解决计算“均值”的差异【英文标题】:How to solve differences in calculating `mean` 【发布时间】:2022-01-07 05:15:04 【问题描述】:

当以两种不同的方式计算mean 时(在数据帧上和在同一个旋转数据帧上),我希望结果是相同的。但是,它们似乎有所不同。我错过了什么吗?

这是数据集:

import pandas as pd # pandas version is 1.3.4

df = pd.read_csv(
    'https://data.rivm.nl/covid-19/COVID-19_aantallen_gemeente_per_dag.csv', 
    usecols = ['Date_of_publication', 'Municipality_code', 'Municipality_name', 'Province', 'Total_reported', 'Hospital_admission', 'Deceased'], 
    parse_dates = ['Date_of_publication'], 
    index_col = ['Date_of_publication'], 
    sep = ';'
).dropna()

df.tail()

我想计算Total_reported 列的每个Date_of_publication 的平均值。

方法一:

df.Total_reported.groupby(df.index).mean()

方法二:

df_pivot = pd.pivot_table(
    df.reset_index(), 
    values='Total_reported', 
    index='Date_of_publication', 
    columns='Municipality_name'
)

df_pivot.mean(axis=1)

【问题讨论】:

我最好的猜测是,其中一个考虑NaN 而另一个不考虑,例如[1,2,NaN] 在一种情况下会给出1 的平均值,而1.5在另一种情况下。你有任何NaN 值吗?如果是这样的话,你可以在计算平均值之前尝试dropna()吗? 我怀疑会出现差异,因为您在进行数据透视时取平均值两次。默认aggfuncnp.mean。所以你不是在比较相同的结果。用sum 而不是mean 来检查它,你可能会得到不同的结果。所以你在比较“Appels met peren”:) 感谢@CutePoison 的评论,但在阅读数据时,我已经放弃了所有 NA。 好点。这里的文档 (pandas.pydata.org/docs/reference/api/pandas.pivot_table.html) 告诉您 np.mean 是默认的 agg 函数。但是,如果已经计算了平均值,那么它不是只是一个数据点,因此取其平均值不会做任何事情吗? 如果你使用 pivot 而不是 pivot_table 有一个例外,你有重复的值,这是你的区别,你首先在第二个 sn-p 中聚合它们,而你使用重复在第一个。 【参考方案1】:

由于我无法将代码示例作为评论发布,我想利用@mozway 的回答,即在执行pivot_table 时原因是columns 中的重复

df = pd.DataFrame("total":[50,10,30,15,10,5],"state":["UC","FI","DK","LM","NA","PL"],index=["2021-11-29"]*3+["2021-11-30"]*3)
df.index.name = "date"
print(df) #No duplicated "state"

#     total  state
#date       
#2021-11-29 50  UC
#2021-11-29 10  FI
#2021-11-29 30  DK
#2021-11-30 15  LM
#2021-11-30 10  NA
#2021-11-30 5   PL

df["total"].groupby(df.index).mean()

#2021-11-29    30.0
#2021-11-30    10.0


pd.pivot_table(df.reset_index(),index="date",values="total",columns="state").mean(axis=1)

#2021-11-29    30.0
#2021-11-30    10.0

正如所见,它给出了相同的结果但是当我们将state 中的PL 更改为NA 时,即我们现在有2xNA 的结果pivot_table变了

df = pd.DataFrame("total":[50,10,30,15,10,5],"state":["UC","FI","DK","LM","NA","NA"],index=["2021-11-29"]*3+["2021-11-30"]*3) #changed the 'PL' 'NA'

#2021-11-29    30.00
#2021-11-30    11.25 #was 10.0 before

【讨论】:

谢谢,这解决了问题。该数据集每天有两行代表阿姆斯特丹市。在日期和市政当局groupby().sum() 之后,问题得到了解决。

以上是关于如何解决计算“均值”的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何根据票数/分数/样本/等计算平均值?

如何在 MS reportviewer/rdlc 中计算计算平均值的平均值?

如何计算2个不同行的平均值

如何计算 Sklearn 中点到质心的平均距离的平均值? [复制]

如何获得 PostgreSQL 中的两个平均值之间的差异,平均值在列上,最终表按两列分组?

分类数据和连续数据在逻辑回归中如何设值