【发布时间】:2021-12-14 02:38:06
【问题描述】:
注意:这个问题和这里的答案不一样:“Pandas: sample each group after groupby”
试图弄清楚如何使用pandas.DataFrame.sample 或任何其他函数来平衡这些数据:
df[class].value_counts()
c1 9170
c2 5266
c3 4523
c4 2193
c5 1956
c6 1896
c7 1580
c8 1407
c9 1324
我需要获取每个类 (c1, c2, .. c9) 的随机样本,其中样本大小等于具有最少实例数的类的大小。在此示例中,样本大小应为 c9 = 1324 类的大小。
有什么简单的方法可以用 Pandas 做到这一点?
更新
为了澄清我的问题,在上表中:
c1 9170
c2 5266
c3 4523
...
数字是 c1,c2,c3,... 类实例的计数,因此实际数据如下所示:
c1 'foo'
c2 'bar'
c1 'foo-2'
c1 'foo-145'
c1 'xxx-07'
c2 'zzz'
...
等等
更新 2
澄清更多:
d = {'class':['c1','c2','c1','c1','c2','c1','c1','c2','c3','c3'],
'val': [1,2,1,1,2,1,1,2,3,3]
}
df = pd.DataFrame(d)
class val
0 c1 1
1 c2 2
2 c1 1
3 c1 1
4 c2 2
5 c1 1
6 c1 1
7 c2 2
8 c3 3
9 c3 3
df['class'].value_counts()
c1 5
c2 3
c3 2
Name: class, dtype: int64
g = df.groupby('class')
g.apply(lambda x: x.sample(g.size().min()))
class val
class
c1 6 c1 1
5 c1 1
c2 4 c2 2
1 c2 2
c3 9 c3 3
8 c3 3
看起来这行得通。主要问题:
g.apply(lambda x: x.sample(g.size().min())) 是如何工作的?我知道“lambda”是什么,但是:
- 在这种情况下,
x中的lambda传递了什么? -
g.size()中的g是什么? - 为什么输出包含 6、5、4、1、8、9 个数字?他们做什么 什么意思?
【问题讨论】: