python - 从 Pandas 的每组中抽取 n 行

标签 python 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)

enter image description here

最佳答案

上一个答案选择了 n groups,而 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 行。

关于python - 从 Pandas 的每组中抽取 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621079/

相关文章:

python - 如何计算具有多个逗号分隔值的列中某个单词的实例数?

python - 如何使用Python根据列名找出两个数据框的差异

Python: "Self"是不是没有定义?

python - Matplotlib 正在打印线图两次/多次

python - scikit-learn 中的 n_jobs 并行化pairwise_distances

Python3 自定义 View 对象

python - Pandas 单元测试 : How to assert equality of NaT and NaN values?

python-3.x - Pandas_datareader错误SymbolWarning:未能读取符号:“T”,替换为NaN

python - TensorFlow,训练产生3个ckpt文件,哪一个是正确的? (音乐_RNN_RBM)

python - PySide 节点图连接项