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

Abh*_*kur 0 python pandas

我有一个像下面这样的熊猫数据框:

col1, col2, label
a,    b   , cat
b,    b1, , mouse
.
.
.........., elephant
.........., mouse
Run Code Online (Sandbox Code Playgroud)

value_counts标签栏:

df.dataframe.value_counts:

cat: 7599
mouse: 6458
dog: 5100
elephant: 5000
Run Code Online (Sandbox Code Playgroud)

我想随机从每个标签类别中选择至少N行,以便我的value_counts变为:

cat: N
mouse: N
dog: N
elephant: N
Run Code Online (Sandbox Code Playgroud)

有这种做法的"pandoic"方式吗?

Max*_*axU 6

您可以先使用sample(frac = 1)方法对DF进行洗牌,然后从每个组中挑选前N行(分组label):

df.sample(frac=1).groupby('label', sort=False).head(N)
Run Code Online (Sandbox Code Playgroud)

演示:

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
Run Code Online (Sandbox Code Playgroud)

建立:

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]
Run Code Online (Sandbox Code Playgroud)

提示:如果你想找到最大可能的N - 你可以使用下面的代码(感谢@NickilMaveli的想法)

N = df.label.value_counts(sort=False).min()  # (or) df.label.value_counts().iloc[-1]
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 5

如果需要,您可以使用samplegroupby例如60%每组样本:

print (df.groupby('label').apply(lambda x: x.sample(frac=0.6)))
Run Code Online (Sandbox Code Playgroud)