python中数据帧n行的随机子集上的聚合

python中数据帧n行的随机子集上的聚合,python,pandas,dataframe,Python,Pandas,Dataframe,我试图在一个包含n行的python数据帧的随机子集上进行聚合。我目前的方法是循环行并在新列中分配“组id”,然后在此列上聚合,但我的数据帧有数十万行,这太慢了。哪种方法更有效 rand = np.random.RandomState(1) df = pd.DataFrame({'column1': rand.randn(300000), 'column2': rand.rand(300000)}) df['groupid'] = 0 df = df.sample(frac=1).reset_in

我试图在一个包含n行的python数据帧的随机子集上进行聚合。我目前的方法是循环行并在新列中分配“组id”,然后在此列上聚合,但我的数据帧有数十万行,这太慢了。哪种方法更有效

rand = np.random.RandomState(1)
df = pd.DataFrame({'column1': rand.randn(300000), 'column2': rand.rand(300000)})
df['groupid'] = 0
df = df.sample(frac=1).reset_index(drop=True) #randomize dataframe rows
group_size = [1, 10, 100, 1000, 10000]
for size in group_size:
        group_num = 0
        for position in range(0, len(df), size):
            df.iloc[position:position + size, df.columns.get_loc('groupid')] =  group_num
            group_num+=1

        results = df.groupby(['groupid'], as_index=True).agg({'column1': 'mean', 'column2': 'mean'})
编辑:我需要精确地使用每行数据一次。输出应该是一个数据帧,每行给出每个组的第1列和第2列的平均值(这样
results.shape[0]=np.ceil(df.shape[0]/size)

更新: 我能够通过首先随机化数据帧,然后使用itertools生成一个包含重复序列号的列表,快速实现所需的行为:

rand = np.random.RandomState(1)
df = pd.DataFrame({'column1': rand.randn(300000), 'column2': rand.rand(300000)})
df = df.sample(frac=1).reset_index(drop=True) #randomize dataframe rows
group_size = [1, 10, 100, 1000, 10000]
for size in group_size:
        df['groupid'] = list(itertools.chain.from_iterable(itertools.repeat(x, size) for x in range(int(np.ceil(df.shape[0]/size)))))[0:df.shape[0]]
        results = df.groupby(['groupid'], as_index=True).agg({'column1': 'mean', 'column2': 'mean'})
您可以使用函数随机洗牌数组:

n=df.shape[0]
对于分组大小中的gs:
a=np.hstack([np.repeat(np.arange(gs),n//gs),np.arange(n%gs)])
np.random.shuffle(a)
df[f'group_size_{gs}']=a

请注意,
np.random.shuffle
会在适当的位置修改数组。

熊猫有内置的采样方法

df = df.sample(n=10)

这将返回由10个随机采样的df行组成的数据帧。无需分组,只需在此基础上进行聚合。

您可以共享一个可复制的示例,其中包含示例数据和预期输出吗?根据我的编辑,我需要每行只使用一次,因此我认为这不起作用。这似乎不能保证组的大小相等。@Kyle您是对的,这是一个快速的快捷方式。我现在编辑了我的答案。