随机抽样

2024-10-06 12:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个示例数据帧,带有一个country列。每个国家记录的相对数量为:

d1.groupby("country").size()

country
Australia       21
Cambodia        58
China          280
India          133
Indonesia      195
Malaysia       138
Myanmar         51
Philippines     49
Singapore     1268
Taiwan          47
Thailand       273
Vietnam        288

如果每个国家有>;100个样本,我如何从中随机选择100个样本?(如果国家有<;=100个样本,则不执行任何操作)。目前,我为新加坡做这件事:

names_nonsg_ls = []
names_sg_ls = []

# if the country is not SG, add it to names_nonsg_ls. 
# else, add it to names_sg_ls, which will be subsampled later.
for index, row in d0.iterrows():
    if str(row["country"]) != "Singapore":
        names_nonsg_ls.append(str(row["header"]))
    else:
        names_sg_ls.append(str(row["header"]))

# Select 100 random names from names_sg_ls
names_sg_ls = random.sample(names_sg_ls, 100)
# Form the list of names to retain
names_ls = names_nonsg_ls + names_sg_ls
# create new dataframe
d1 = d0.loc[d0["header"].isin(names_ls)]

但是手动为每个有100个名字的国家创建一个新的列表只是一个糟糕的形式,更不用说我首先必须手动挑选出有100个名字的国家。你知道吗


Tags: toifnames国家sgcountrylsrow
1条回答
网友
1楼 · 发布于 2024-10-06 12:32:57

您可以按国家分组,然后根据组大小进行抽样:

d1.groupby("country", group_keys=False).apply(lambda g: g.sample(100) if len(g) > 100 else g)

示例:

df = pd.DataFrame({
    'A': ['a','a','a','a','b','b','b','c','d'],
    'B': list(range(9))
})

df.groupby('A', group_keys=False).apply(lambda g: g.sample(3) if len(g) > 3 else g)
#   A   B
#2  a   2
#0  a   0
#1  a   1
#4  b   4
#5  b   5
#6  b   6
#7  c   7
#8  d   8

相关问题 更多 >