我有一个像下面这样的pandas数据框:
col1, col2, label
a, b , cat
b, b1, , mouse
.
.
.........., elephant
.........., mouse
和标签列的value_counts
:
df.dataframe.value_counts:
cat: 7599
mouse: 6458
dog: 5100
elephant: 5000
我想随机从每个标签类别中选择至少N行,以便我的value_counts变为:
cat: N
mouse: N
dog: N
elephant: N
这样做有“pandoic”的方法吗?
答案 0 :(得分:6)
您可以先使用sample(frac=1)方法对DF进行随机播放,然后从每个组中挑选前N行(由label
分组):
df.sample(frac=1).groupby('label', sort=False).head(N)
演示:
In [108]: df.sample(frac=1).groupby('label', sort=False).head(3)
Out[108]:
col1 label
11 9 a
28 4 a
58 0 a
96 5 c
99 3 b
35 6 c
88 8 c
97 9 b
83 7 b
设定:
In [106]: df = pd.DataFrame({'label':np.random.choice(list('abc'), 100), 'col1':np.random.randint(0, 10, 100)})
In [107]: df
Out[107]:
col1 label
0 4 c
1 6 b
2 9 c
3 0 b
4 5 a
5 3 a
6 3 b
7 6 c
8 7 b
9 6 a
.. ... ...
90 4 b
91 5 b
92 8 c
93 2 c
94 9 a
95 2 a
96 5 c
97 9 b
98 8 b
99 3 b
[100 rows x 2 columns]
提示:如果您想找到最大可能的N - 您可以使用以下代码(感谢@NickilMaveli for the idea)
N = df.label.value_counts(sort=False).min() # (or) df.label.value_counts().iloc[-1]
答案 1 :(得分:2)
如果需要,您可以将sample
与groupby
一起使用每组60%
个样本:
print (df.groupby('label').apply(lambda x: x.sample(frac=0.6)))