Python 3.x 为什么样本(frac=1)和原始数据之间的平均聚合groupby结果不同?
我不知道这是否真的是一个基本问题 所以我一直在玩Groupby,用熊猫进行聚合和取样。。使用此sample.csv文件 以下是原始数据分组的结果,使用平均聚合('i'这里是数据帧): 然后,这里是使用平均聚合的样本(frac=1,replace=True)分组的数据结果:Python 3.x 为什么样本(frac=1)和原始数据之间的平均聚合groupby结果不同?,python-3.x,pandas,aggregate,pandas-groupby,Python 3.x,Pandas,Aggregate,Pandas Groupby,我不知道这是否真的是一个基本问题 所以我一直在玩Groupby,用熊猫进行聚合和取样。。使用此sample.csv文件 以下是原始数据分组的结果,使用平均聚合('i'这里是数据帧): 然后,这里是使用平均聚合的样本(frac=1,replace=True)分组的数据结果: i_sampling = i[["Precipitation","Speed","State"]].sample(frac=1,replace=True) test2 = i_sampling.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)的概念是制作一个数据帧,该数据帧具有100%的随机索引的数据帧样本(replace=True),我认为这就像是一个随机索引数据帧,所以我希望groupby原始和采样的平均值必须相同
我的问题是:
但是结果显示出了差异?有人能解释一下为什么会发生这种情况吗?。。我知道很多研究使用这些方法进行引导分析(所以这个问题只是为了澄清聚合和groupby在这个案例中是如何工作的)
(注意:如果是不同的情况,我当然接受,例如:使用低于1的分形,这意味着样本只使用DF的一部分(低于100%),因此如果结果不同,则很明显)谢谢@Chris的反馈!,这个极简主义的情节表明 替换=真 确实会对样本分布产生一点点影响,这对于引导方法来说是有意义的:
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)
不确定这里是否是这种情况,但通常您需要在执行groupby.remove
replace=True
之前对数据进行排序,然后它们将变得相同。@Chris,好的,所以当replace=False时它已修复:o,谢谢!所以,我想知道replace=True是如何工作的?您选择一个样本,保留它,但将其替换回池中。理论上,您可能会得到所有相同的行。这就是替换的定义
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)