根据计数从pandas数据帧中选择随机行

时间:2017-01-10 09:53:46

标签: python pandas

我有一个像下面这样的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”的方法吗?

2 个答案:

答案 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)

如果需要,您可以将samplegroupby一起使用每组60%个样本:

print (df.groupby('label').apply(lambda x: x.sample(frac=0.6)))