从数据框中提取特定行数
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)
我有一个包含两列的 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)