【问题标题】:Why is the results of groupby with mean aggregate is different between sample(frac=1) and original data?为什么样本(frac=1)和原始数据的平均聚合结果不同?
【发布时间】:2020-01-20 07:29:31
【问题描述】:

我不知道这是否真的是一个基本问题..

所以我一直在玩 Groupby,使用 Pandas 进行聚合和采样.. 使用这个 sample.csv 文件 https://sendeyo.com/en/a36d65b2a7

这是原始数据分组的结果,使用平均聚合('i'这里是一个DataFrame):

    test1 = i.groupby('State')[["Precipitation","Speed"]].mean() 
    test1.head(5)

                  Precipitation     Speed
     State                              
    Alabama          0.925000       5.891875
    Alaska           0.488824       8.630924
    Arizona          0.234000       4.015500
    Arkansas         0.380833       4.372500
    California       1.017763       4.192895

然后这里是使用 sample(frac=1, replace=True) groupby 使用平均聚合的数据结果:

    i_sampling = i[["Precipitation","Speed","State"]].sample(frac=1,replace=True)
    test2 = i_sampling.groupby('State')[["Precipitation","Speed"]].mean()
    test2.head(5)

                   Precipitation     Speed
    State                              
    Alabama          0.810588       5.951765
    Alaska           0.416984       9.862222
    Arizona          0.082500       3.581875
    Arkansas         0.494118       3.469412
    California       1.103448       3.536207

但我无法理解和接受这些结果,以下是我的理解:

我的理解概念,sample(frac=1,replace=True) 正在制作一个 DataFrame,它具有 100% 的 DataFrame 样本和随机索引 (replace=True),我认为这就像一个随机索引 DataFrame , 所以我期望原始和采样的分组平均值必须相同。

我的问题是:

但是显示的结果有区别吗?有人可以解释一下为什么会发生这种情况吗?..我知道有很多研究使用这些方法进行引导分析,(所以这个问题只是为了澄清聚合和 groupby 在这种情况下的工作原理) p>

(注意:如果是不同的情况,我当然接受,例如:使用低于 1 的 frac,这意味着样本只使用了 DF 的一部分(低于 100%),所以结果是否有差异是很清楚的)

【问题讨论】:

  • 不确定是否是这种情况,但通常您需要在执行 groupby 之前对数据进行排序
  • 删除replace=True,它们将变得相同。
  • @Chris,好的,所以当 replace=False 时它已修复:o,谢谢!
  • 那么,我想知道 replace=True 是如何工作的?
  • 你选择一个样本,保留它,但放回池中。从理论上讲,您最终可能会得到所有相同的行。这就是替换的定义

标签: python-3.x pandas aggregate pandas-groupby


【解决方案1】:

感谢@Chris 的反馈!这个简约的情节表明

替换=真

确实会对样本分布产生一点影响,这作为 Bootstrap 的方法是有意义的:

i_sampling_true = i[["Precipitation","Speed","State"]].sample(frac=1,replace=True)
i_sampling_false = i[["Precipitation","Speed","State"]].sample(frac=1,replace=False)

def dataframe_distplot(df, col, rug=True, hist=False, title_df="Title DF", color="Red", axes="None"):
     if axes == "None": sns.distplot(df[col], color=color, rug=rug, hist=hist).set_title(title_df)
     else: sns.distplot(df[col], ax=axes, color=color, rug=rug, hist=hist).set_title(title_df)

ax = dataframe_distplot(i, "Precipitation", True, False, title_df="Dist Plot Original vs Replace=False")
dataframe_distplot(i_sampling_false, "Precipitation", True, False, title_df="Dist Plot Original vs Replace=False",color="blue", axes=ax)

ax = dataframe_distplot(i, "Precipitation", True, False, title_df="Dist Plot Original vs Replace=True")
dataframe_distplot(i_sampling_true, "Precipitation", True, False, title_df="Dist Plot Original vs Replace=True",color="yellow", axes=ax)

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多