我有一个像下面这样的熊猫数据框:
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"方式吗?
您可以先使用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)
如果需要,您可以使用sample,groupby例如60%每组样本:
print (df.groupby('label').apply(lambda x: x.sample(frac=0.6)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |