- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个与它非常相似的数据框,但有数千个值:
import numpy as np
import pandas as pd
# Setup fake data.
np.random.seed([3, 1415])
df = pd.DataFrame({
'Class': list('AAAAAAAAAABBBBBBBBBB'),
'type': (['short']*5 + ['long']*5) *2,
'image name': (['image01']*2 + ['image02']*2)*5,
'Value2': np.random.random(20)})
我能够找到一种方法,使用以下代码对每个图像、每个类别和每个类型的 2 个值进行随机抽样:
df2 = df.groupby(['type', 'Class', 'image name'])[['Value2']].apply(lambda s: s.sample(min(len(s),2)))
我得到了以下结果:
我正在寻找一种对该表进行子集化的方法,以便能够根据类型和类别随机选择随机图像(“图像名称”)(并为随机选择的图像保留 2 个值。
我想要的输出的 Excel 示例:
最佳答案
IIUC,问题是您不想对 image name
列进行分组,但如果该列未包含在分组依据中,您将丢失该列
你可以先创建grouby对象
gb = df.groupby(['type', 'Class'])
现在您可以使用列表推导来交互 grouby block
blocks = [data.sample(n=1) for _,data in gb]
现在您可以连接 block ,以重建随机采样的数据帧
pd.concat(blocks)
输出
Class Value2 image name type
7 A 0.817744 image02 long
17 B 0.199844 image01 long
4 A 0.462691 image01 short
11 B 0.831104 image02 short
或
您可以修改您的代码并将列 image name
添加到 groupby 中,就像这样
df.groupby(['type', 'Class'])[['Value2','image name']].apply(lambda s: s.sample(min(len(s),2)))
Value2 image name
type Class
long A 8 0.777962 image01
9 0.757983 image01
B 19 0.100702 image02
15 0.117642 image02
short A 3 0.465239 image02
2 0.460148 image02
B 10 0.934829 image02
11 0.831104 image02
编辑:保持每组图像相同
我不确定您是否可以避免对这个问题使用迭代过程。您可以只遍历 groupby block ,过滤组,获取随机图像并保持每个组的名称相同,然后像这样从剩余图像中随机抽样
import random
gb = df.groupby(['Class','type'])
ls = []
for index,frame in gb:
ls.append(frame[frame['image name'] == random.choice(frame['image name'].unique())].sample(n=2))
pd.concat(ls)
输出
Class Value2 image name type
6 A 0.850445 image02 long
7 A 0.817744 image02 long
4 A 0.462691 image01 short
0 A 0.444939 image01 short
19 B 0.100702 image02 long
15 B 0.117642 image02 long
10 B 0.934829 image02 short
14 B 0.721535 image02 short
关于Python - 每组 Pandas 随机抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49619681/
如何从填充有 1 和 0 的矩阵中抽取 n 个随机点的样本? a=rep(0:1,5) b=rep(0,10) c=rep(1,10) dataset=matrix(cbind(a,b,c),nrow
这个问题在这里已经有了答案: How to efficiently get 10% of random numbers, then 10% of remaining 90 etc untill al
我有一个与它非常相似的数据框,但有数千个值: import numpy as np import pandas as pd # Setup fake data. np.random.seed([3,
我是一名优秀的程序员,十分优秀!