从数据框中提取特定行数

Extracting specific number of rows from dataframe

我有一个包含两列的 csv 文件,即图像名称和 ID。如图所示,同一 ID 有多个图像名称。图像名称与 id 的数量不同。我需要根据 ids 提取相同数量的图像名称并删除超出的行。例如,如果 id 5 的图像数量最少,比如 8,那么所有 id 都会有相应的 8 个图像名称。

Table format

此代码提取前 100 个 ID,但每个 ID 的图片数量不同,即 ID =1 有 11 张图片,而 ID=2 有 24 张图片,依此类推

`select_id = df.loc[df['id'] <= 100]`

每个 ID 的预期输出图像数量相等 Expected output

欢迎来到 Stack Overflow!在这里提问时,提供“最小可重现示例”和示例数据 (https://whosebug.com/help/minimal-reproducible-example) 是个好主意。这次我为您创建了一些示例数据。请参阅下面的代码以及如何像您一样进行子集化正在描述。

# Create some example data
id <- c(0,0,0,1,1,1,1,2,2,3,3,3,3,4,4,4,4,4,4,4)
file_names <- paste("file_number_",seq(1:length(id)),".jpg",sep = "")
dataframe <- data.frame(id = id, file_names = file_names)

# view the data
dataframe

初始数据如下:

# id         file_names
# 1   0  file_number_1.jpg
# 2   0  file_number_2.jpg
# 3   0  file_number_3.jpg
# 4   1  file_number_4.jpg
# 5   1  file_number_5.jpg
# 6   1  file_number_6.jpg
# 7   1  file_number_7.jpg
# 8   2  file_number_8.jpg
# 9   2  file_number_9.jpg
# 10  3 file_number_10.jpg
# 11  3 file_number_11.jpg
# 12  3 file_number_12.jpg
# 13  3 file_number_13.jpg
# 14  4 file_number_14.jpg
# 15  4 file_number_15.jpg
# 16  4 file_number_16.jpg
# 17  4 file_number_17.jpg
# 18  4 file_number_18.jpg
# 19  4 file_number_19.jpg
# 20  4 file_number_20.jpg

现在按照您的描述进行子集化。

# find the lowest amount of entries for an id
min <- min(table(dataframe$id))

#create and empty df for your subset
final_dataframe <- data.frame()

# get the first two images for every id
for (i in 1:length(unique(dataframe$id))) {
  final_dataframe <- rbind(dataframe[which(dataframe$id == unique(dataframe$id)[i]),][1:2,],final_dataframe)
}

# view
final_dataframe

最终数据帧:

# id         file_names
# 14  4 file_number_14.jpg
# 15  4 file_number_15.jpg
# 10  3 file_number_10.jpg
# 11  3 file_number_11.jpg
# 8   2  file_number_8.jpg
# 9   2  file_number_9.jpg
# 4   1  file_number_4.jpg
# 5   1  file_number_5.jpg
# 1   0  file_number_1.jpg
# 2   0  file_number_2.jpg

你可以这样做:

# get min number of occurrences
min_len = df['id'].value_counts().min()

# group by and get head for each group
df.groupby('id').head(min_len)