繁体   English   中英

从pandas中的每个组中抽取n行

[英]Sample n rows from each group in pandas

在下面的数据框中,我在三个字段上进行分组:'主题','代表'和'yval'。

import pandas as pd 
yval = [[1]*30 + [2]*20 + [1]*20 + [2]*30 ]
yval = reduce(lambda x,y: x+y, yval)
df = pd.DataFrame({'yval': yval , 'xval':np.random.randn(100)})
df['Subject'] = ['S01'] * 50 + ['S02'] * 50
l = [[x] * 10 for x in range(3)] + [[x] * 10 for x in range(2)] + [[x] * 10 for x in range(2)] + [[x] * 10 for x in range(3)]
l = reduce(lambda x,y: x+y,l)
df['Rep'] = l
df


for k, t in df.groupby(['Subject', 'yval', 'Rep']):
    print k 


('S01', 1, 0)
('S01', 1, 1)
('S01', 1, 2)
('S01', 2, 0)
('S01', 2, 1)
('S02', 1, 0)
('S02', 1, 1)
('S02', 2, 0)
('S02', 2, 1)
('S02', 2, 2)

我试图找到一种方法从组中选择n行。 在此示例中,假设n = 2 ,我们可能会得到以下结果。 如果n=4 ,我期待一切(整个数据帧)。

('S01', 1, 0)
('S01', 1, 2)
('S01', 2, 0)
('S01', 2, 1)
('S02', 1, 0)
('S02', 1, 1)
('S02', 2, 1)
('S02', 2, 2)

在此输入图像描述

如果我理解正确,这是你可以做到的一种方式:

import random

# Do the groupby
gps = df.groupby(['Subject', 'yval', 'Rep'])

两个选项,一个更快但需要更多行。

# Option 1: sample (20.6 µs per loop)
group_list = random.sample(gps.groups.keys(), len(gps.groups)-2)

# Option 2: shuffle (15.1 µs per loop)
# Store the dict keys into a list
group_list = list(gps.groups.keys())
random.shuffle(group_list)
# Get all but the last two
group_list = group_list[:-2]

上一个答案选择n ,而OP想要从每个组中选择n行。 然后它应该完成

ix = np.hstack([np.random.choice(v, n, replace=False) for v in gps.groups.values()])

其中gps = df.groupby(['Subject', 'yval', 'Rep'])

然后df.iloc(ix)将从每组中随机选择n行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM