问题:
如何使用pandas df.groupby()函数创建随机选择的组组?
示例:
我想将数据帧分组为大小为n的随机组,其中n对应于给定列中的唯一值的数量。
我有一个包含各种列的数据框,包括“id”。某些行具有唯一ID,而其他行可能具有相同的ID。例如:
c1 id c2
0 a 1 4
1 b 2 6
2 c 2 2
3 d 5 7
4 y 9 3
实际上,此数据框最多可包含1000行。
我希望能够使用以下标准对此数据框进行分组:
例如,示例数据框(上面)可能变为:
group1:
c1 id c2
0 a 1 4
4 y 9 3
组2:
c1 id c2
1 b 2 6
2 c 2 2
3 d 5 7
其中n = 2
感谢您的建议。
答案 0 :(得分:2)
uniq groupby
声明似乎很难。一种方法:
uniq=df['id'].unique()
random.shuffle(uniq)
groups=np.split(uniq,2)
dfr=df.set_index(df['id'])
for gp in groups : print (dfr.loc[gp])
对于
c1 id c2
id
9 y 9 3
1 a 1 4
c1 id c2
id
5 d 5 7
2 b 2 6
2 c 2 2
如果群组的尺寸(n
)确实划分len(uniq)
,您可以改为使用np.split(uniq,range(n,len(uniq),n))
。
答案 1 :(得分:2)
这是一种方法:
import numpy as np
df = pd.DataFrame({'c1':list('abcdy'), 'id':[1,2,2,5,9], 'c2':[4,6,2,7,3]})
n = 2
shuffled_ids = np.random.permutation(df['id'].unique())
id_groups = [shuffled_ids[i:i+n] for i in xrange(0, len(shuffled_ids), n)]
groups = [df['id'].apply(lambda x: x in g) for g in id_groups]
输出:
In [1]: df[groups[0]]
Out[1]:
c1 c2 id
1 b 6 2
2 c 2 2
3 d 7 5
In [2]: df[groups[1]]
Out[2]:
c1 c2 id
0 a 4 1
4 y 3 9
此方法不涉及更改索引,以防您需要保留索引。