在下面的数据框中,我在三个字段上执行groupby:“Subject”、“Rep”和“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]
关于python - 从 Pandas 中的每个组中抽取n行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40621079/